ASP.NET MVC: Tratamento centralizado de mensagens com TempData

Olá, pessoal

Hoje vou mostrar uma forma legal de tratar a exibição de mensagens em uma aplicação ASP.NET MVC. A ideia é baseada <neste post>, de uma forma mais simplificada, como sugerida nos comentários do mesmo. Serve como um pequeno exercício de ActionResult e extension methods.

O propósito aqui consiste em encapsular o nosso bom e velho <TempData> em uma action result customizada. Com isso, evitamos a repetição da atribuição ao TempData em todas as actions, deixamos o código da action mais expressivo e menos sujeito a erros, já que o TempData usa uma “string mágica” como chave.

Primeiro, criamos um action result, nomeado TempDataActionResult, que irá encapsular a atribuição da mensagem ao TempData:


public class TempDataActionResult : ActionResult
{
    private readonly ActionResult _actionResult;
    private readonly string _mensagem;

    public TempDataActionResult(ActionResult actionResult, string mensagem)
    {
        _actionResult = actionResult;
        _mensagem = mensagem;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.Controller.TempData["Mensagem"] = _mensagem;
        _actionResult.ExecuteResult(context);
    }
}

Percebam no código acima que tudo que o action result faz é guardar a mensagem no TempData e executar o action result passado em seu construtor. Sendo assim, o action result funciona como um <decorator> concreto, adicionando funcionalidade a um objeto, no caso o action result fornecido no construtor.

Em seguida, para deixarmos a action mais simples e expressiva, encapsulamos a criação do TempDataActionResult em um extension method:

public static class ActionResultExtensions
{
    public static ActionResult ComMensagemDeSucesso(this ActionResult actionResult, string mensagem)
    {
        return new TempDataActionResult(actionResult, mensagem);
    }
}

Por fim, vamos alterar uma action que utilizava o TempData para utilizar o extension method.

Abaixo código antes da alteração:

[HttpPost]
public ActionResult Salvar(Cliente cliente)
{
    // ....
    // se tudo deu certo
    TempData["Mensagem"] = "Cliente salvo com sucesso";
    return RedirectToAction("Index");
}

Agora, o código alterado:

[HttpPost]
public ActionResult Salvar(Cliente cliente)
{
    // ....
    // se tudo deu certo
    return RedirectToAction("Index").ComMensagemDeSucesso("Cliente salvo com sucesso");
}

Vejam que a action ficou mais limpa e não temos mais a atribuição ao TempData, com sua string mágica “Mensagem”, espalhada em várias actions.

Também deixamos mais explícito o conceito de redirecionar com uma mensagem de sucesso.

Bacana, não é?

Era isso! Até a próxima!

Anúncios

7 comentários em “ASP.NET MVC: Tratamento centralizado de mensagens com TempData

Participe! Vamos trocar uma ideia sobre desenvolvimento de software!

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s