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!
Muito legal! Parabéns Robson.
CurtirCurtir
Gostei muito legal!
CurtirCurtir
Gostei muito
mas da pra usar em PartialViewResult?
CurtirCurtir
Valeu.
Não me recordo, cara. Já tem milhares de anos que não uso, mas acredito que sim.
[]s
CurtirCurtir