ASP.NET MVC: Usando a coleção TempData

Blz galera

Uma forma simples de se exibir mensagens ao usuário no ASP.NET MVC é usar a coleção TempData.

Assemelha-se à conhecida Session, porém seu valor dura somente até a próxima requisição HTTP da qual você leia novamente seu valor. Traduzindo, leu TempData de novo, seu valor se perdeu.

Vamos ver como fica na prática:

1) Crie um controller como abaixo:

public class TesteController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Salvar()
    {
        TempData["mensagem"] = "Mensagem de sucesso";
        return RedirectToAction("Index");
    }
}

Note que criei a entrada “mensagem” na coleção TempData, dentro da action Salvar, que só é chamada via POST.

2) Criamos a view Index, a qual servirá para chamarmos a action Salvar e para exibir a mensagem em TempData[“mensagem”].

Obs.: Para criar a view de forma rápida, basta clicar com o botão direito dentro do corpo da action Index e entrar em “Add View…”. Deixe o nome como “Index” e não marque a opção para criar uma view fortemente tipada.

A view deverá se parecer com (usando a view engine Razor *):

<div>
@TempData["mensagem"]
</div>

@using (Html.BeginForm("Salvar", "Teste"))
{
    <input type="submit" value="OK" />
}

Por simplicidade, exibi apenas o conteúdo dentro da tab <body>. Veja que o helper BeginForm “aponta” para a action “Salvar” do controller “Teste”.

Percebam também que na mesma view estou exibindo o contéudo de TempData, em: @TempData[“mensagem”].

3) Prontinho. Agora é testar. Rode a aplicação e acesse a view Index (http://localhost:xxxxx/Teste/).

Ao acessar a view, a única coisa disponível será o botão “OK”. Clique no botão para chamar a action “Salvar” e preencher o TempData.

Após ser redirecionado para a view Index, você verá que a mensagem em TempData será exibida:

4) Ok. Agora para comprovarmos o tempo de vida da coleção, experimente atualizar a página (F5). Ao ser feita uma nova requisição HTTP que irá ler o TempData, ele simplesmente é descartado e você verá novamente apenas o botão OK.

Você pode também testar se a entrada em TempData é diferente de null, antes de exibi-la, caso haja, por exemplo, a intenção de mostrá-la com algum texto ou formatação especial:

@if (TempData["mensagem"] != null)
{
    <div>
    Atenção: @TempData["mensagem"]
    </div>
}

Simples né?

Conclusão:

A coleção TempData é bastante útil para exibir mensagem temporárias, tais como mensagens de sucesso após retornar de algum cadastro, já que desejamos que a mensagem seja exibida apenas naquele momento (e desapareça caso formos para outro link e voltar ou atualizarmos a página).

Até a próxima!

* Ainda não conhece o Razor? Ele é uma nova View Engine  lançada mês passado com o ASP.NET MVC 3. Baixe o MVC 3 aqui e divirta-se!

Anúncios

4 comentários em “ASP.NET MVC: Usando a coleção TempData

  1. Muito interessante como dura uma única requisição eu não preciso me preocupar em limpar uma lista de erros ou componente antes de varrer por novos tratamentos de erros, mto obrigado pela contribuição! Coisitas úteis pro dia-a-dia.

    Abraço, Nelson Jr.

    1. Olá
      Sao conceitos sutilmente diferentes.
      ViewBag (e ViewData) passa dados entre o controller e a view dentro de uma mesma requisição HTTP. No exemplo deste post, não seria possível utiliza-lo, pq ao “setarmos” a mensagem de sucesso, fazemos um redirecionamento (RedirectionToAction), o qual instrui o browser a fazer uma nova requisição HTTP (sendo assim o conteudo de ViewBag seria perdido).
      Já com o TempData os dados são preservados, porque ele funciona internamente com uma Session, com a diferença que será “limpado” automaticamente na próxima requisição HTTP que for feita. Por isso, ele se adequa bem a esses casos onde queremos exibir uma simples mensagem uma unica vez, sem nos preocuparmos em ter que apagá-lo “na mão”.
      Espero que tenha conseguido explicar.
      []s

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