将操作作为另一个操作的结果返回

本文关键字:操作 结果 返回 作作 另一个 | 更新日期: 2023-09-27 18:29:22

当我试图从另一个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,而不是使用返回的Action:RedirectToAction("Action", new { param1 = vm.Param1Prop-1, param2 = vm.Param2Prop });,一切正常。我完全理解为什么RedirectToAction有效,但我不明白为什么调用Action方法无效。有人能启发我吗?

将操作作为另一个操作的结果返回

您可能看到的是原始POST中的ModelState值。这些将优先于您返回到视图中的那些。您可以通过清除ModelState中的值来纠正此问题。但是,你不应该这么做。

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

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

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