如何在ASP.NET MVC中RedirectToAction而不会丢失请求数据

使用ASP.NET MVC有可能需要RedirectToAction情况(如表单提交)。

其中一种情况是,在表单提交后遇到validation错误,需要redirect到表单,但希望URL反映表单的URL,而不是它提交给的操作页面。

由于我要求表单包含最初的POST编辑数据,为了方便用户以及validation,我如何通过RedirectToAction()传递数据? 如果我使用viewData参数,我的POST参数将被更改为GET参数。

解决scheme是使用TempData属性来存储所需的请求组件。

例如:

 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接口,并使用其他机制来存储临时数据。 我不会那样做,除非你知道一个事实(通过测量和分析)会话状态的使用正在伤害你。

看看MVCContrib ,你可以这样做:

  using MvcContrib.Filters; [ModelStateToTempData] public class MyController : Controller { // ... } 

还有一种避免tempdata的方法。 我喜欢的模式涉及为无效表单的原始渲染和重新渲染创build1个动作。 它是这样的:

 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(); 

这或多或less就是这个模式。 有点假的。 有了这个,您可以创build1个视图来处理表单的呈现,重新显示值(因为表单将填充以前的值),并显示错误消息。

当发布到这个行动,如果它的有效它把控制转移到另一个行动。

我试图在.netvalidation框架中简化这个模式,因为我们构build了对MVC的支持。

如果要将数据传递给redirect的操作,则可以使用的方法是:

 return RedirectToAction("ModelUpdated", new {id = 1}); // The definition of the action method like public ActionResult ModelUpdated(int id);