参数值在一个操作方法中为null,在另一个操作方法中为非null

时间:2014-08-19 12:57:52

标签: asp.net-mvc-4 parameters actionmethod

我的控制器名为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。那是为什么?

1 个答案:

答案 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 })) {
  ....