41

我有这样的事情:

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?

4

2 回答 2

92

这里有两个选项。

  1. 表单中的隐藏字段,或
  2. 将其添加到开始表单方法中的路由值参数中。

编辑

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

或者

 @using(Html.BeginForm("action", "controller",
                       new { clubid = @Viewbag.Club.id }, FormMethod.Post, null)
于 2013-06-09T20:07:16.510 回答
1

我喜欢的另一种选择,一旦我开始看到代码不符合 DRY 就可以概括,是使用一个重定向到另一个控制器的控制器。

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

  return RedirectToAction(action, "Accounts");
}

我发现这使我可以在一个位置应用我的逻辑并重新使用它,而不必在视图中撒上 JavaScript 来处理这个问题。而且,正如我所提到的,当我看到这被滥用时,我可以重构以供重用。

于 2014-07-30T15:41:39.537 回答