如何在ASP.NET MVC中进行RedirectToAction而不丢失请求数据
时间:2020-03-05 18:37:40 来源:igfitidea点击:
使用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状态会伤害我们,否则我不会这样做。
回答
还有另一种避免使用tempdata的方法。我喜欢的模式涉及为无效表单的原始渲染和重新渲染创建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验证框架中简化此模式。
回答
看一下MVCContrib,我们可以执行以下操作:
using MvcContrib.Filters; [ModelStateToTempData] public class MyController : Controller { // ... }