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