What Are ViewData, ViewBag, & TempData in ASP.NET MVC?
Alguns desenvolvedores podem ter dificuldades com as diferenças e o uso de ViewData, ViewBag e TempData no ASP.NET MVC. Esta postagem do blog explicará tudo.
Muitas vezes vi desenvolvedores iniciantes lutarem com as diferenças e o uso de ViewData, ViewBag e TempData no ASP.NET MVC. E embora existam muitos artigos e postagens de blog sobre esse tópico por aí, tentarei explicá-lo de forma simples.
Para começar, ViewData, ViewBag e TempData, todos os três são objetos em ASP.NET MVC usados para transportar ou passar dados em diferentes cenários. Você pode ter um requisito para transmitir dados nos seguintes casos:
- Passe dados do controlador para visualizar;
- Passar dados de um controlador para outro;
- Passar dados de uma ação para outra;
- Passar dados entre solicitações HTTP subsequentes
Em um nível mais alto, podemos descrever o uso de ViewData, ViewBag e TempData, conforme mostrado na imagem abaixo:

Passando dados do controlador para a exibição
Vamos considerar um cenário em que você está passando dados do controlador para a exibição. Normalmente, passamos dados complexos para a exibição usando o modelo. Aqui, digamos que temos uma View fortemente tipada que está usando o modelo de dados List, conforme mostrado na listagem abaixo:
public ActionResult Index()
{
List<Product> p = new List<Product>() {
new Product { Id = 1, Name = "Pen", Price = 300 },
new Product { Id = 2, Name = "Pencil", Price = 100 }
};
return View(p);
}
Na Vista, os dados são exibidos renderizando o modelo conforme mostrado na listagem abaixo:
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
th>
<th>
@Html.DisplayNameFor(model => model.Price)
th>
<th>th>
tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
td>
<td>
@Html.DisplayFor(modelItem => item.Price)
td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
td>
tr>
}
</table>
Agora temos um requisito para passar dados (diferentes de um modelo) para a exibição do controlador. Há duas maneiras possíveis de transmitir dados.

Vamos supor que queremos passar uma string simples para a exibição além do modelo de dados Product.
Passing data using ViewBag
Podemos passar dados usando o ViewBag, conforme mostrado na listagem abaixo:
public ActionResult Index()
{
ViewBag.data1 = "I am ViewBag data";
return View(p);
}
Na exibição, os dados do ViewBag podem ser lidos como a propriedade do ViewBag, conforme mostrado na listagem abaixo:
<h2>@ViewBag.data1</h2>
Passing data using ViewData
Podemos passar dados usando o ViewData, conforme mostrado na listagem abaixo:
public ActionResult Index()
{
ViewData["data1"] = "I am ViewBag data";
return View(p);
}
Na exibição, os dados de ViewData podem ser lidos como o par de valores de cadeia de caracteres do ViewData, conforme mostrado na listagem abaixo:
<h2>@ViewData["data1"]h2>
Vamos examinar as diferenças entre ViewData e ViewBag. ViewBag é uma propriedade dinâmica baseada no tipo dinâmico, enquanto ViewData é um objeto de dicionário. Podemos ler dados de ViewBag como uma propriedade e de ViewData como um par chave-valor. Alguns pontos sobre ambos são os seguintes:
ViewData
- É uma propriedade do tipo ViewDataDictionary classe.
- Os dados podem ser passados na forma de um par chave-valor.
- Para ler os dados de tipo complexo na exibição, a conversão de tipo é necessária.
- Para evitar a exceção, a verificação nula é necessária.
- A vida útil de ViewData é restrita à solicitação atual e se torna nula no redirecionamento.
- ViewData é uma propriedade da classe ControllerBase
ViewBag
- É uma propriedade do tipo dynamic.
- Os dados são passados como uma propriedade do objeto.
- Não há necessidade de typecasting para ler os dados.
- Não há necessidade de verificação nula.
- A vida útil do ViewBag é restrita à solicitação atual e se torna nula no redirecionamento.
- ViewBag é uma propriedade da classe ControllerBase.
Na classe ControllerBase, ambos são definidos como propriedade, conforme mostrado na imagem abaixo:

Podemos resumir ViewBag e ViewData como objetos usados para passar dados do controlador para a exibição em um único ciclo. O valor atribuído em ViewBag e ViewData é anulado na próxima solicitação HTPP ou na navegação para outra exibição.
TempData
Um dos principais atributos de ViewData e ViewBag é que seu ciclo de vida é limitado a uma solicitação HTTP. No redirecionamento, eles perdem os dados. Podemos ter outro cenário para passar dados de uma solicitação HTTP para a próxima solicitação HTTP; por exemplo, passar dados de um controlador para outro controlador ou de uma ação para outra ação. TempData é usado para passar dados de uma solicitação para a próxima.

Digamos que queremos navegar para a ação Ler da ação Índice e, durante a navegação, passar dados para a ação Ler da ação Índice. Portanto, na ação Índice, podemos atribuir um valor a TempData, conforme mostrado na listagem abaixo:
public ActionResult Index()
{
TempData["data1"] = "I am from different action";
return RedirectToAction("Read");
}
Podemos ler TempData como um par chave-valor. Na ação Ler, TempData pode ser lido conforme mostrado na listagem abaixo:
public string Read()
{
string str;
str = TempData["data1"].ToString();
return str;
}
Assim como ViewData, TempData também é um objeto de dicionário e, para ler os dados, é necessário typecasting e verificação nula. Lembre-se de que o TempData pode persistir dados apenas para a solicitação HTTP subsequente. Quando você tiver certeza sobre o redirecionamento, use TempData para passar os dados.
Alguns pontos sobre TempData são os seguintes:
- TempData é usado para passar dados de uma solicitação HTTP para a próxima solicitação HTTP.
- Em outras palavras, TempData é usado para passar dados de um controlador para outro controlador ou ação para outra ação.
- TempData é uma propriedade da classe BaseController.
- TempData armazena dados em um objeto de sessão
- TempData é uma propriedade da classe ControllerBase
- Para ler dados, Typecasting e verificação nula são necessários.
- O tipo de TempData é TempDataDictionary.
- TempData funciona com redirecionamento HTTP como código de status HTTP 302/303
Resumo
ViewData, ViewBag e TempData são usados para passar dados entre controlador, ação e exibições. Para passar dados do controlador para a exibição, ViewData ou ViewBag podem ser usados. Para passar dados de um controlador para outro, TempData pode ser usado.
Espero que agora os conceitos de ViewBag, ViewData e TempData estejam um pouco mais claros – e obrigado por ler!
Experimente nossos controles jQuery HTML5 para seus aplicativos da web e aproveite imediatamente seus recursos impressionantes. Baixe o teste gratuito agora!
