在Html.BeginForm中传递多个参数的方法(MVC)

43

我有一个像这样的东西:

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" />
}

以下 Post 操作可以很好地完成此操作:

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

  return RedirectToAction(...);

}

然而,我希望从@ViewBag.Club对象中传递一个额外的参数:

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

我该如何在 BeginForm 中编写这段代码?
2个回答

96

这里有两个选项。

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

编辑

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

@Johan,这两者之间有很大的区别吗? - Vahx
1
我更多的是指安全性、性能或其他方面?其中一种是旧方法还是新方法? - Vahx

1

我喜欢的另一种选择是,一旦发现代码不符合DRY原则,就可以进行泛化,使用一个控制器重定向到另一个控制器。

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

  return RedirectToAction(action, "Accounts");
}

我发现这样可以让我在一个地方应用我的逻辑,并且无需在视图中添加 JavaScript 来处理这个问题。而且,正如我所提到的,我可以重构以便重复使用,因为我看到这样被滥用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接