Como RedirectToAction em ASP.NET MVC sem perder dados de solicitação

votos
115

Usando ASP.NET MVC há situações (como o envio do formulário) que podem exigir uma RedirectToAction.

Uma tal situação é quando você encontrar erros de validação após a submissão do formulário e precisa redirecionar de volta para a forma, mas gostaria que o URL para refletir a URL do formulário, não a página de ação que se submete a.

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

Publicado 05/08/2008 em 06:33
fonte usuário
Em outras línguas...                            


5 respostas

votos
76

A solução é usar a propriedade TempData para armazenar os componentes Pedido 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);
}
Respondeu 05/08/2008 em 06:43
fonte usuário

votos
36

Tenha em mente que TempData armazena a coleção de formulário na sessão. Se você não gosta que o comportamento, você pode implementar a nova interface ITempDataProvider e usar algum outro mecanismo para armazenar dados temporários. Eu não faria isso se você não sabe para um fato (via medição e perfis) que o uso de estado de sessão é ferir você.

Respondeu 07/08/2008 em 06:12
fonte usuário

votos
13

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

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Respondeu 05/04/2009 em 10:36
fonte usuário

votos
8

Não há outra maneira que evita TempData. O padrão de gosto envolve a criação de 1 ação para o original processar e renderizar novamente de forma inválida. É 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 uma visão para lidar com tornando os formulários, mensagens de erro dos valores (uma vez que o formulário será preenchido com os valores anteriores), e mostrando exibindo re-.

Quando a postagem para esta acção, se a sua validade transfere o controle sobre a outra ação.

Eu estou tentando fazer este teste padrão fácil no quadro de validação .net como vamos construir o suporte para MVC.

Respondeu 25/08/2008 em 23:06
fonte usuário

votos
2

Se você quer passar dados para a acção reorientada, 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);
Respondeu 30/11/2013 em 09:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more