web-dev-qa-db-ja.com

Html.BeginForm MVCで複数のパラメーターを渡す

私はこのようなものを持っています:

public ActionResult Create(int clubid)
{
  var club = db.Clubs.Single(c=>c.Id == clubid);
  ViewBag.Club = club;
  Competition comp = db.Competitions.Create();
  return View(comp)
}

そして、私の.cshtmlで:

@Model Models.Competition
...
@Using(Html.BeginForm())
{
  ...
  <input type="submit" value="Save" />
}

これは、次のポストアクションで正常に機能します。

[HttpPost]
public ActionResult Create(Competition comp)
{
  if (ModelState.IsValid){...}

  return RedirectToAction(...);

}

ただし、@ViewBag.Clubオブジェクトから追加のパラメーターを渡します。

[HttpPoSt]
public ActionResult Create(int clubid, Competition comp){...}

BeginFormでこれをどのようにコーディングしますか?

32
Andy Johnston

ここには2つのオプションがあります。

  1. フォーム内の非表示フィールド、または
  2. フォーム開始メソッドのルート値パラメーターに追加します。

編集

@Html.Hidden("clubid", ViewBag.Club.id)

または

 @using(Html.BeginForm("action", "controller",
                       new { clubid = @Viewbag.Club.id }, FormMethod.Post, null)
77
Johan

私が気に入っているもう1つのオプションは、コードがDRYに準拠していないことが確認できたら一般化できますが、あるコントローラーを使用して別のコントローラーにリダイレクトすることです。

public ActionResult ClientIdSearch(int cid)
{
  var action = String.Format("Details/{0}", cid);

  return RedirectToAction(action, "Accounts");
}

これにより、ビューにJavaScriptを散らさずにロジックを1つの場所に適用して再利用できるため、これを処理できます。そして、私が述べたように、私はこれが乱用されているのを見て、再利用のためにリファクタリングすることができます。

0
Jose Q