在使用 ASP.NET MVC 的情况下(例如表单提交)可能需要 RedirectToAction
。
一种这样的情况是当您在提交表单后遇到验证错误并需要重定向回表单,但希望 URL 反映表单的 URL,而不是它提交到的操作页面。
由于我要求表单包含最初的POST
数据,为了方便用户以及验证目的,我如何通过 RedirectToAction()
传递数据?如果我使用 viewData 参数,我的 POST
参数将更改为 GET
参数。
解决方案是使用 TempData 属性来存储所需的 Request 组件。
例如:
public ActionResult Send()
{
TempData["form"] = Request.Form;
return this.RedirectToAction(a => a.Form());
}
然后在您的“表单”操作中,您可以执行以下操作:
public ActionResult Form()
{
/* Declare viewData etc. */
if (TempData["form"] != null)
{
/* Cast TempData["form"] to
System.Collections.Specialized.NameValueCollection
and use it */
}
return View("Form", viewData);
}
请记住,TempData 将表单集合存储在会话中。如果您不喜欢这种行为,您可以实现新的 ITempDataProvider 接口并使用其他一些机制来存储临时数据。我不会这样做,除非您知道(通过测量和分析)使用 Session 状态正在伤害您的事实。
看看 MVCContrib,你可以这样做:
using MvcContrib.Filters;
[ModelStateToTempData]
public class MyController : Controller {
//
...
}
还有另一种避免临时数据的方法。我喜欢的模式涉及为无效表单的原始渲染和重新渲染创建 1 个操作。它是这样的:
var form = new FooForm();
if (request.UrlReferrer == request.Url)
{
// Fill form with previous request's data
}
if (Request.IsPost())
{
if (!form.IsValid)
{
ViewData["ValidationErrors"] = ...
} else {
// update model
model.something = foo.something;
// handoff to post update action
return RedirectToAction("ModelUpdated", ... etc);
}
}
// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();
或多或少是这样的模式。有点伪君子。有了这个,您可以创建 1 个视图来处理呈现表单、重新显示值(因为表单将填充以前的值)以及显示错误消息。
当发布到此操作时,如果其有效,则将控制权转移到另一个操作。
在我们构建对 MVC 的支持时,我试图在 .net validation framework 中简化这种模式。
如果要将数据传递给重定向操作,可以使用的方法是:
return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like public ActionResult ModelUpdated(int id);
TempData 是保持数据从一个动作到另一个动作的解决方案。
Employee employee = new Employee
{
EmpID = "121",
EmpFirstName = "Imran",
EmpLastName = "Ghani"
};
TempData["Employee"] = employee;