Como RedirectToAction em ASP.NET MVC sem perder dados do pedido
-
08-06-2019 - |
Pergunta
Usando ASP.NET MVC há situações (tais como o envio de formulários) que podem exigir uma RedirectToAction
.
Uma tal situação é quando você encontrar erros de validação após o envio de um formulário e a necessidade de redirecionar de volta para o formulário, mas gostaria de URL para refletir a URL do formulário, e não a página de ação e submete-o ao.
Como posso requerer o formulário para conter o originalmente POST
ed dados, para maior comodidade do usuário, bem como fins de validação, como eu posso passar os dados por meio do RedirectToAction()
?Se eu usar o viewData parâmetro, o meu POST
parâmetros serão alterados para GET
parâmetros.
Solução
A solução é usar o TempData propriedade para armazenar o Pedido pretendido componentes.
Por exemplo:
public ActionResult Send()
{
TempData["form"] = Request.Form;
return this.RedirectToAction(a => a.Form());
}
Em seguida, na sua "Forma de ação" 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);
}
Outras dicas
Tenha em mente que TempData lojas a coleção de formulário na sessão.Se você não gosta desse comportamento, você pode implementar o novo ITempDataProvider interface e usar algum outro mecanismo de temp para armazenar dados.Eu não faria isso, a menos que você sabe para um fato (através da medição e da análise de perfis) que a utilização de estado da Sessão está prejudicando você.
Dê uma olhada no MVCContrib, você pode fazer isso:
using MvcContrib.Filters;
[ModelStateToTempData]
public class MyController : Controller {
//
...
}
Não há outro caminho que evita tempdata.O padrão de gosto envolve a criação de 1 ação para o original processar e re-processamento do formulário inválido.Ele é algo como isto:
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 1 vista para lidar com processamento do formulário, re-apresentar os valores (como o formulário será preenchido com os valores anteriores), e mostrando mensagens de erro.
Quando o lançamento para esta ação, se válido transfere o controle para outra ação.
Eu estou tentando fazer esse padrão fácil no .net framework de validação como podemos construir suporte para MVC.
Se você desejar passar os dados para a redirecionado ação, 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);