当我尝试从另一个Action返回一个Action时,我遇到了一个问题。 我有这样的事情:
public ActionResult Action (int param1, string param2)
{
ActionViewModel vm = new ActionViewModel();
vm.Param1Prop = param1;
vm.Param2Prop = param2;
return View(vm);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Action (ActionViewModel vm)
{
//Do Something...
if (vm.DoItAgain)
{
return Action(vm.Param1Prop-1, vm.Param2Prop);
}
return View(vm);
}
当行return Action(vm.Param1Prop-1, vm.ParamProp);
转到Action(int param1, string param2)
时,执行并且一切看起来都很顺利。但不要。渲染结果看起来像执行了return View(vm)
,vm
的所有值都与Post Action中的所有值相同,而不是我传递给return Action(vm.Param1Prop-1, vm.ParamProp);
的值。
我不确定为什么不工作,ActionResult返回被忽略了?第一个Action方法中的代码执行正常(我调试并在其中放入一个日志来检查它),第一个方法的返回是响应的结束,那么为什么看起来这条线从未发生过呢?
我还尝试修改PostAction上的vm以查看vm是否以某种方式被感染。这也不起作用。
为了做到这一点,我放了一个RedirectToAction而不是使用return Action:
RedirectToAction("Action", new { param1 = vm.Param1Prop-1, param2 = vm.Param2Prop });
并且一切正常。我完全理解为什么RedirectToAction工作,但我无法弄清楚为什么调用Action方法不行。
任何人都可以启发我吗?
答案 0 :(得分:4)
您可能看到的是原始POST中的ModelState
值。这些将优先于您返回视图的那些。您可以通过清除ModelState
中的值来解决此问题。但是,您不需要。
你不应该从另一个回复一个动作。您应该将重定向返回到该操作:
return RedirectToAction("Action",
new { param1 = vm.Param1Prop-1, param2 = vm.Param2Prop });
因为您现在已经执行了正确的重定向,而不是直接从POST返回GET操作的结果,所以当原始请求结束时您将被清除ModelState
并且您将看不到旧的已发布值。