Como RedirectToAction no asp.net MVC sem perder dados de solicitação

Usando o ASP.NET MVC, há situações (como o envio de formulários) que podem exigir um RedirectToAction .

Uma dessas situações é quando você encontra erros de validação após o envio de um formulário e precisa redirect para o formulário, mas deseja que o URL reflita o URL do formulário, não a página de ação enviada.

Como eu necessito que o formulário contenha os dados originalmente POST , para conveniência do usuário, bem como para fins de validação, como posso passar os dados através do RedirectToAction() ? Se eu usar o parâmetro viewData, meus parâmetros POST serão alterados para os parâmetros GET .

A solução é usar a propriedade TempData para armazenar os componentes de solicitação desejados.

Por exemplo:

 public ActionResult Send() { TempData["form"] = Request.Form; return this.RedirectToAction(a => a.Form()); } 

Então, em sua ação “Form” você pode ir:

 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); } 

Tenha em mente que TempData armazena a coleção de formulários na session. Se você não gostar desse comportamento, poderá implementar a nova interface ITempDataProvider e usar outro mecanismo para armazenar dados temporários. Eu não faria isso a menos que você saiba de fato (via medição e perfil) que o uso do estado da session está prejudicando você.

Dê uma olhada no MVCContrib , você pode fazer isso:

 using MvcContrib.Filters; [ModelStateToTempData] public class MyController : Controller { // ... } 

Existe outra maneira que evita tempdata. O padrão que eu gosto envolve a criação de uma ação para a renderização original e a nova renderização do formulário inválido. É algo assim:

 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(); 

Esse é o padrão mais ou menos. Um pouco pseudoy. Com isso, você pode criar uma visualização para manipular a renderização do formulário, exibindo novamente os valores (já que o formulário será preenchido com valores anteriores) e exibindo mensagens de erro.

Quando o lançamento para esta ação, se for válido, transfere o controle para outra ação.

Eu estou tentando fazer este padrão fácil no framework de validação .net como nós construímos suporte para MVC.

Se você quiser passar dados para a ação redirecionada, o método que você pode usar é:

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