假设我有以下行动:
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");
我可以这样做吗?
如果此功能无法开箱即用,那么我会制作,博客并发布!
答案 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操作的信息。
这不仅是针对您具体案例的更广泛答案,而且值得。