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 POSTed 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.

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top