Olá pessoal, neste post farei uma breve explicação de como trabalhar com mecanismos de transferência de dados no asp.net mvc, que existe uma certa semelhança entre eles mas existem recomendações de uso quanto ao cenário em que se aplica. Esta é uma questão que sempre vejo em alguns fóruns e listas de discussões, portanto resolvi escrever este post para entrar em um detalhe maior.
A ViewBag, ViewData e TempData são propriedades da classe base ControllerBase e ViewPage e basicamente são utilizados para transferir dados entre Controllers, Actions e Views.
ViewBag e ViewData
As propriedades ViewBag e ViewData, tem o mesmo objetivo, portar dados do Controller para uma View, porém a ViewData (do tipo ViewDataDictionary que implementa a interface IDirectionary<string, object>) é um dicionário de chaves/valores onde você determina uma chave string é possível aplicar um valor qualquer como object. A ViewBag é um wrapper para a ViewData, e esta por sua vez, utiliza recursos do .Net Framework 4.0 tendo pro definição seu tipo como dynamic, o que nos permite criar propriedades em tempo de execução, fornecendo tipagem além de elegância. Ambas as propriedades são preenchidas em Actions (veja o método View da classe Controller do Asp.Net MVC http://aspnet.codeplex.com/SourceControl/changeset/view/68345#266451) e ficam disponíveis na View a ser renderizada e são recomendados para os cenários:
· Preencher controles de seleção (combox, listbox, lista de checkboxes, lista de radiobuttons, etc..).
· Transferir pequenos valores de dados (tipos primitivos).
· Informações extras (exemplo: dados do usuário conectado a aplicação).
É importante destacar que devemos ter um cuidado maior quando utilizamos estas propriedades, pois se na View o código tentar acessar um valor não definido na ViewData ou ViewBag uma exceção será lançada na página. Quando utilizamos a ViewData, por estarmos utilizando um dicionário com uma chave em string e valor em object, é necessário realizar unboxing para o tipo correto do valor quando precisarmos acessar algo específico do objeto. Já com a ViewBag o unboxing torna-se desnecessário porém o mesmo cuidado quanto a existência de uma propriedade deve ser levado em consideração.
Um exemplo do uso da ViewData e ViewBag:
public ActionResult Index() {
ViewData["Produto"] = "Guitarra";
ViewBag.Cliente = "Felipe Oriani";
return View();
}
Acessando estas informações na view:
Cliente: @ViewBag.Cliente
<br/><br />
Produto: @ViewData["Produto"]
<br/><br/>
Cliente (ViewData): @ViewData["Cliente"]
Como dito anteriormente, a ViewBag utiliza a ViewData para armazenar as propriedades, portanto as propriedades dinâmicas que são criadas na ViewBag tornam-se acessíveis na ViewData, mas recomenda-se o uso direto da ViewBag, uma vez que o projeto utilize a versão 3 do Asp.Net MVC.

TempData
Esta propriedade está presente também na classe ControllerBase e é do tipo TempDataDictionary (que implementa a interface IDirectionay<string, object) que trata-se de um dicionário de chave/valor. Seu uso é semelhante à ViewData, porém o objetivo principal da TempData são dados temporários que podem ser transportados para um novo contexto Http. Cenários recomendados:
· Mover um objeto para outra action.
· Manter algum estado quando um Redirect é realizado.
Vamos a um exemplo simples:
public ActionResult Direcionar()
{
TempData["Tecnologia"] = "ASP.NET MVC";
return RedirectToAction("Index");
}
Na view Index, conseguimos recuperar este valor, da mesma forma que fazemos com a ViewData, porém acessando a TempData.
TempData: @TempData["Tecnologia"]
Acessando diretamente a action Index, a TempData virá nula pois não foi setado. No caso de acessar a action Direcionar vocÊ será redirecionado para a index após ter criado uma chave na TempData, sendo assim, após o redirect do protocolo http para a action Index, um valor foi persistido no TempData (internamente em Session) o que permite o acesso desta chave no destino (lembrando que após a finalização da execução do Request, a TempData é liberada). Veja a imagem abaixo realizando um Debug ao tentar executar a Action 'Direcionar'.

Bem pessoal, por hoje é isso, algo simples e fácil de utilizar-se no asp.net mvc.
Um abraço