C# 如何在ASP.NET MVC中重定向到操作而不丢失请求数据
使用ASP.NET MVC时,有些情况(例如表单提交)可能需要C# 如何在ASP.NET MVC中重定向到操作而不丢失请求数据,c#,asp.net-mvc,C#,Asp.net Mvc,使用ASP.NET MVC时,有些情况(例如表单提交)可能需要重定向到操作 其中一种情况是,表单提交后遇到验证错误,需要重定向回表单,但希望URL反映表单的URL,而不是表单提交到的操作页面 由于我要求表单包含原始的POSTed数据,为了方便用户以及验证目的,我如何通过RedirectToAction()传递数据?如果使用viewData参数,我的POST参数将更改为GET参数。解决方案是使用TempData属性存储所需的请求组件 例如: public ActionResult Send() {
重定向到操作
其中一种情况是,表单提交后遇到验证错误,需要重定向回表单,但希望URL反映表单的URL,而不是表单提交到的操作页面
由于我要求表单包含原始的
POST
ed数据,为了方便用户以及验证目的,我如何通过RedirectToAction()
传递数据?如果使用viewData参数,我的POST
参数将更改为GET
参数。解决方案是使用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接口,并使用其他一些机制来存储临时数据。除非您(通过测量和分析)知道会话状态的使用正在伤害您,否则我不会这样做。还有另一种方法可以避免临时数据。我喜欢的模式包括为无效表单的原始渲染和重新渲染创建一个操作。事情是这样的:
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();
差不多就是这样。有点假。使用此功能,您可以创建一个视图来处理呈现表单、重新显示值(因为表单将填充以前的值)以及显示错误消息
当过帐到此操作时,如果其有效,则将控制权转移到另一个操作
我试图在中简化此模式,因为我们构建了对MVC的支持。看看,您可以这样做:
using MvcContrib.Filters;
[ModelStateToTempData]
public class MyController : Controller {
//
...
}
如果要将数据传递给重定向操作,可以使用以下方法:
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;
RedirectToAction(a=>a.Form())没有使用MVCv2为我编译,您使用的是MVCv3吗?这是MVC1(2008)之前的版本。我相信lambda是在某个阶段被删除的(有一个codeplex项目MVCContrib重新引入了它们,不过您也可以在该阶段使用它们的helper属性:)。在mvc2中,您应该能够转到RedirectToAction(“Form”),即以字符串的形式命名,尽管我粗略地回忆起,如果您热衷于搜索,mvc2或MVC 3引入了一个类似于MVCContrib的helper属性。无论如何,对这个问题感兴趣的人可能仍然感兴趣:如果有错误,为什么不返回相同的视图?如果模型有效,通常会调用RedirectToAction——或者我遗漏了什么?!我也使用TempData,据我所知,您的解决方案存在的问题是,如果用户在发布无效数据后刷新页面,他们将收到“是否要重新提交表单数据”确认。使用MattMitchell所说的TempData解决方案可以消除这个问题。酷。似乎有人在preview 5中也注意到了这个基本想法。