Quero compartilhar com vocês uma forma fácil de passar dados de uma Action para outra. Usualmente quando precisamos fazer isso, recorremos a Session ou algum parâmetro passado via GET. Com o MVC 3 temos agora o TempData.
TempData é um dicionário de dados que tem por trás um objeto de sessão. Este objeto persiste os valores por apenas uma requisição. É ideal para enviar mensagens de um controlador para outro.
Segue um exemplo:
public class InsertError { public string ErrorMessage { get; set; } public string OriginalFirstName { get; set; } public string OriginalLastName { get; set; } }
Enviaremos uma instância dessa classe entre uma requisição e outra, usualmente guardamos no TempData mensagens de erro e IDs entre uma requisição e outra.
E agora as nossas Actions. São duas actions no mesmo controlador:
public ActionResult InsertCustomer(string firstName, string lastName) { // Verifica por erros if (String.IsNullOrEmpty(firstName) || String.IsNullOrEmpty(lastName)) { InsertError error = new InsertError(); error.ErrorMessage = "Os nomes são obrigatórios."; error.OriginalFirstName = firstName; error.OriginalLastName = lastName; TempData["error"] = error; return RedirectToAction("NewCustomer"); } // Sem erros // ... return View(); } public ActionResult NewCustomer() { InsertError err = TempData["error"] as InsertError; if (err != null) { // Se recebermos uma variável do tipo InsertError nós a exibimos. ViewData["FirstName"] = err.OriginalFirstName; ViewData["LastName"] = err.OriginalLastName; ViewData["ErrorMessage"] = err.ErrorMessage; } // ... return View(); }
Nesse exemplo passamos um objeto InsertError diretamente da Action InsertCustomer para a Action NewCustomer. No nosso caso é uma classe que guarda dados de uma mensagem de erro.
O exemplo anterior foi retirado da MSDN http://msdn.microsoft.com/en-us/library/dd394711.aspx
Obrigado ao @miguelitobh pela sugestão de tema. Se você também tem uma sugestão me mande uma mensagem no @ivanpaulovich.