是否可以将ASP.NET MVC请求从一个动作“转移”到另一个动作?

时间:2009-08-26 15:07:42

标签: asp.net-mvc post routing action

假设我有以下行动:

public ActionResult DoSomething()
{
    // Some business logic
    return RedirectToAction("AnotherAction", RouteData.Values);
}

public ActionResult AnotherAction(string name, int age)
{
   ...
}

以下表格:

<form method="post" action="DoSomething">
    <input name="name" type="text" />
    <input name="age" type="text" />
    <input type="submit" value="Go" />
</form>

点击该表单上的提交将转到 DoSomething 操作,然后转到 AnotherAction - 将所有相关值传递到名称年龄。这是一种享受!

但是我显然无法访问 AnotherAction 中的任何其他提交的表单值,因为从DoSomething重定向时它们会丢失:

public ActionResult AnotherAction(string name, int age)
{
   // This won't work
   var other = Request.Form["SomeDynamicVariable"];
}

更理想的是 TransferToAction 方法,重新运行MVC引擎“想象”表单已发布到 AnotherAction

return TransferToAction("AnotherAction");

我可以这样做吗?

如果此功能无法开箱即用,那么我会制作,博客并发布!

4 个答案:

答案 0 :(得分:1)

使用TempData构造存储Request.Form。 TempData仅适用于给定的请求,因此在处理完成后它将被清除。

public ActionResult DoSomething()
{
    // Some business logic
    TempData["PostedFormValues"] = Request.Form;
    return RedirectToAction("AnotherAction", RouteData.Values);
}

public ActionResult AnotherAction(string name, int age)
{
   ...
   if (TempData["PostedFormValues"] != null)
   {
       //process here
   }
}

答案 1 :(得分:1)

您的控制器操作也是有效的公共功能 所以你可以这样做

public ActionResult DoSomething(){    
// Some business logic    
// Get Params from Request
      return AnotherAction(name, age);
}

public ActionResult AnotherAction(string name, int age){
   ...
}

当你现在从AnotherAction访问Request对象时,它仍然是相同的,因为你显然没有再发出请求。

答案 2 :(得分:0)

执行此操作的一种方法是从第一个操作调用第二个操作并捕获响应。 这不是微不足道的,as discussed here

答案 3 :(得分:0)

您可以使用临时数据传递modelstate。拥有少量FilterAttributes将真正简化流程,而且非常简单。

您应该阅读http://ben.onfabrik.com/posts/automatic-modelstate-validation-in-aspnet-mvc以正确使用过滤器属性。此博客还包含大量有关使用模型状态和PRG模式的正确mvc操作的信息。

这不仅是针对您具体案例的更广泛答案,而且值得。