如何在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);
- 在编辑器/显示模板中使用部分
- ASP.NET MVC部分视图:input名称前缀
- DataAnnotationsvalidation(正则expression式)在asp.net mvc 4 – 剃刀视图
- 在ASP.NET MVC中设置默认的JSON序列化程序
- 在ASP.NET MVC中编译视图
- 使用System.ComponentModel.DataAnnotations与entity framework4.0
- ASP.NET .NET MVC禁用每个字段级别的客户端validation
- 发布JSON数据到ASP.NET MVC
- 没有MediaTypeFormatter可用于从媒体types为“text / plain”的内容读取“String”types的对象,