繁体   English   中英

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

[英]How to RedirectToAction in ASP.NET MVC without losing request data

使用 ASP.NET MVC 在某些情况下(例如表单提交)可能需要RedirectToAction

一种这样的情况是当您在提交表单后遇到验证错误并需要重定向回表单,但希望 URL 反映表单的 URL,而不是它提交到的操作页面。

由于我要求表单包含最初的POST数据,为了用户方便以及验证目的,我如何通过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 接口并使用其他一些机制来存储临时数据。 我不会这样做,除非你知道一个事实(通过测量和分析)使用 Session 状态正在伤害你。

看看MVCContrib ,你可以这样做:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}

还有另一种避免临时数据的方法。 我喜欢的模式涉及为无效表单的原始渲染和重新渲染创建 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 验证框架简化此模式。

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

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM