Asp.net mvc 4 参数值在一个操作方法中为null,在另一个操作方法中为非null

Asp.net mvc 4 参数值在一个操作方法中为null,在另一个操作方法中为非null,asp.net-mvc-4,parameters,actionmethod,Asp.net Mvc 4,Parameters,Actionmethod,我使用三种操作方法调用了文档: public ActionResult Save(string returnUrl){ TempData["returnUrl"]=returnUrl; return View(viewName: "Save"); } [HttpPost] public ActionResult Save(string returnUrl){ return Redirect(returnUrl); } 及 下面是Sa

我使用三种操作方法调用了文档:

 public ActionResult Save(string returnUrl){
      TempData["returnUrl"]=returnUrl;
      return View(viewName: "Save");
 }


 [HttpPost]
 public ActionResult Save(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"/>
 }
@Html.Hidden(TempData[“returnUrl”].ToString())
@使用(Html.BeginForm){
}
@使用(Html.BeginForm(actionName:“Cancel”,controllerName:“Documents”)){
}

当然,上面的代码并没有反映出我在现实世界中需要做什么,但有一个问题使我将代码简化到这个最简单的阶段。问题是调用
Cancel
操作方法时,
returnUrl
参数为空。为什么会这样?

为了回发到
FormCollection
,与表单关联的输入需要位于
标记内(除非使用)。如果您有两个表单,需要回发
returnUrl
的值,则需要两个输入。如果使用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)
{
  ....
}
看法


输入应该在form元素中,但是最好在
Html.BeginForm()
method中设置值,那么Save和Cancel方法之间有什么区别呢。为什么我不需要在Save方法中传递任何东西呢?没有区别。这两种方法都不适用于您在此处发布的代码段。如果“Save”方法正在工作,则其原因是您遗漏了某些内容(您所显示的内容甚至都不会编译)。我会发布一个更详细的答案。
[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 })) {
  ....