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

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

由于我要求表单包含最初的POST数据,为了方便用户和验证,我如何通过RedirectToAction()传递数据? 如果我使用viewData参数,我的POST参数将更改为GET参数。

===============>>#1 票数:80 已采纳

解决方案是使用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);
}

===============>>#2 票数:37

请记住,TempData将表单集合存储在会话中。 如果您不喜欢这种行为,可以实现新的ITempDataProvider接口并使用其他一些机制来存储临时数据。 除非你知道(通过测量和分析)使用会话状态会伤害你,否则我不会这样做。

===============>>#3 票数:13

看看MVCContrib ,你可以这样做:

using MvcContrib.Filters;

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

===============>>#4 票数:8

还有另一种避免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个视图来处理呈现表单,重新显示值(因为表单将填充以前的值),并显示错误消息。

当发布此操作时,如果其有效,则将控制转移到另一个操作。

我正在尝试在.net验证框架中使这个模式变得容易,因为我们构建了对MVC的支持。

===============>>#5 票数:2

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

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);

  ask by Matt Mitchell translate from so

未解决问题?本站智能推荐: