Ir para o conteúdo
What Are ViewData, ViewBag, & TempData in ASP.NET MVC?

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.

6min read

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:

Em um nível mais alto, podemos descrever o uso de ViewData, ViewBag e TempData, conforme mostrado na imagem
 
                        

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.

Agora temos um requisito para passar dados (diferentes de um modelo) para a exibição do controlador.

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:

Na classe ControllerBase, ambos são definidos como propriedade, conforme mostrado na imagem

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.

 TempData

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!

 
Solicite uma demonstração