我的控制器名为Documents,有三种操作方法:
public ActionResult Save(string returnUrl){
TempData["returnUrl"]=returnUrl;
return View(viewName: "Save");
}
[HttpPost]
public ActionResult Save(string returnUrl){
return Redirect(returnUrl);
}
和
[HttpPost]
public ActionResult Cancel(string returnUrl){
return Redirect(returnUrl);
}
这是Save.cshtml视图的内容:
@Html.Hidden(TempData["returnUrl"].ToString())
@using (Html.BeginForm){
<!--Some html here-->
<input type="submit" value="Save"/>
}
@using (Html.BeginForm(actionName:"Cancel",controllerName:"Documents")){
<input type="submit" value="Cancel"/>
}
当然,上面的代码并没有反映我在现实世界中需要做的事情,但是有一个问题让我把我的代码剥离到这个最简单的阶段。问题是当我调用returnUrl
操作方法时,Cancel
参数为null。那是为什么?
答案 0 :(得分:1)
要回发至FormCollection
,与表单关联的输入需要位于<form>
标记内(使用form attribute时除外)。在您有2个表单且需要回发returnUrl
的值的情况下,您需要2个输入。如果使用html帮助器,这将创建具有重复id的元素。更好的方法是在表单元素中包含值,例如
控制器
[HttpGet]
public ActionResult Save(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View("Save");
}
[HttpPost]
public ActionResult Save(string returnUrl, MyModel, model)
{
....
}
[HttpPost]
public ActionResult Cancel(string returnUrl, MyModel, model)
{
....
}
查看
@using (Html.BeginForm("Save", "Documents", new { ReturnUrl = ViewBag.ReturnUrl })) {
....
@using (Html.BeginForm("Cancel", "Documents", new { ReturnUrl = ViewBag.ReturnUrl })) {
....