作为另一个动作的结果返回动作

时间:2014-11-05 09:29:59

标签: c# asp.net-mvc asp.net-mvc-2

当我尝试从另一个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方法不行。 任何人都可以启发我吗?

1 个答案:

答案 0 :(得分:4)

您可能看到的是原始POST中的ModelState值。这些将优先于您返回视图的那些。您可以通过清除ModelState中的值来解决此问题。但是,您不需要。

你不应该从另一个回复一个动作。您应该将重定向返回到该操作:

return RedirectToAction("Action",
       new { param1 = vm.Param1Prop-1, param2 = vm.Param2Prop });

因为您现在已经执行了正确的重定向,而不是直接从POST返回GET操作的结果,所以当原始请求结束时您将被清除ModelState并且您将看不到旧的已发布值。