C# 如何在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() {

使用ASP.NET MVC时,有些情况(例如表单提交)可能需要
重定向到操作

其中一种情况是,表单提交后遇到验证错误,需要重定向回表单,但希望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中也注意到了这个基本想法。