【问题标题】:Return Action as result of another action作为另一个动作的结果返回动作
【发布时间】:2015-01-01 10:22:27
【问题描述】:

当我尝试从另一个动作返回一个动作时,我遇到了一个问题。 我得到了这样的东西:

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 方法不起作用。 有谁能给我指点一下吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你是对的。 ModelState 不清楚并与我得到的结果相匹配,但为什么 ModelState 没有用我在 GET 操作上设置的值覆盖或更新?我猜上下文和路由值来自 POST 操作,因为没有调用该方法的请求,但我不确定。顺便说一句,我同意正确的方法是重定向而不是调用 Action 方法,是一种确保生命周期正确的方法,但我想知道为什么“替代”方式不起作用。好吧,我知道为什么不工作,因为正如你所说的 ModelState,但我不确定为什么 ModelState 不更新
    • 当您使用编辑器/显示模板时,框架会在许多地方寻找并尝试填充值。 model 只是其中之一 - ModelState 是另一个(主要用于重新显示带有输入值和验证消息的表单)。 ModelState 始终优先。因此,如果您不想使用 ModelState 值,则需要清除它们:msdn.microsoft.com/en-us/library/…
    • 请记住,当您明确返回另一个操作时,它仍然是一个 POST 操作(与发布表单时相同的 POST 操作)。在您的示例中,您将在 POST 期间调用旨在用于 GET 的操作。
    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多