ASP .NET MVC - Conceitos : ViewData, ViewBag e TempData


Neste artigo vamos recordar alguns conceitos básicos e terminologias usadas na tecnologia ASP . NET MVC. Hoje veremos os conceitos relacionados a ViewData, ViewBag e TempData.

Revisão de Conceitos - Teoria

Ao começar a usar a tecnologia ASP .NET MVC você vai encontrar muitas referências a ViewData, ViewBag e TempData e pode ficar confuso, pois existem similaridades e diferenças entre esses objetos.

O ASP .NET MVC é uma implementação da arquitetura MVC para o ASP .NET em um framework com o objetivo de criar aplicações WEB no padrão MVC e fornecer uma alternativa ao modelo WebForm do ASP .NET disponível até então. O framework ASP .NET MVC fornece um ambiente robusto e leve que esta integrado aos recursos do ASP .NET como master pages e membership sendo definido no namespace System.Web.Mvc e apresenta os seguintes componentes:

    Models - Os objetos Model (modelo) são as partes da aplicação que implementam a lógica o domínio de dados da aplicação e retornam e armazenam o estado do modelo em um banco de dados.
    Views - As views (visões) são os componentes que exibem a interface do usuário e em geral é criada a partir do modelo de dados.
    Controllers - Controllers (controladores) são os componentes que tratam com a interação do usuário, trabalham com o modelo e selecionam uma visão para ser exibida; Em uma aplicação MVC uma view somente exibe informação , o controller trata e retorna a entrada do usuário e a interação.

Todos os três objetos estão disponíveis como propriedades de views e controllers e podemos dizer que eles tem um objetivo em comum:

Tanto ViewData, ViewBag e TempData tem como objetivo transportar pequenas quantidades de dados entre views ou de controllers para views.

Os objetos ViewData e ViewBag atuam bem nos seguintes cenários:

Já o objeto TempData trabalha bem em um único cenário:

Nota: Para trabalhar com uma maior quantidade de dados você deve usar o objeto ViewModel.

1- ViewData

Conceito : Os dados viajam do controlador para a view através de um dicionário ViewDataDictionary. Este ViewDataDictionary é uma classe dicionário que é chamada ViewData.

A propriedade dictionary ViewData pode ser usada para preencher os dados que você deseja passar para uma view

Exemplos:

C#
ViewData["mensagem"] = "Macoratti, quase tudo para Visual Basic";
ViewData["HoraAtual"] = DateTime.Now;
VB .NET

ViewData("mensagem") = "Macoratti, quase tudo para Visual Basic"
ViewData("HoraAtual") = DateTime.Now

2- ViewBag

ViewBag é apenas um invólucro dinâmico em torno de ViewData, sendo uma propriedade dinâmica baseada no recurso dynamic da plataforma .NET.

Com ViewBag você não precisa escrever a palavra-chave dynamic, ele usa a palavra-chave dynamic internamente.

Dessa forma, ViewBag  pode ser vista como a biblioteca de dados dinâmico.

Exemplos:

C#
ViewBag.mensagem = "Macoratti, quase tudo para Visual Basic";
ViewData.HoraAtual = DateTime.Now;
VB .NET

ViewBag.mensagem = "Macoratti, quase tudo para Visual Basic"
ViewBag.HoraAtual =  DateTime.Now

3- TempData

TempData ajuda na manutenção de dados quando você se move de um controlador para outro controlador. Para manter os dados ele utiliza uma variável de sessão (internamente).

TempData é semelhante a uma sessão de curta duração mas possui um tempo de vida maior que ViewBag e ViewData pois persiste desde a sua criação até ser chamado.

Exemplo:

 [HttpPost]
 public ActionResult gerarMatricula(Pessoa p)
  {
     // Meu objeto Aluno
      var _aluno = new Aluno
                     {
                           Nome = p.Nome,
                           Email = p.Email
                     };
        // Pertistindo os dados até o próximo requisição
        TempData["Aluno"] = _aluno;
        // Fazendo o Redirect entre Controllers
        return RedirectToAction("gerarMatriculaAluno");
    }

    [HttpGet]
    public ActionResult gerarMatriculaAluno()
    {
        // Verificando se aluno é nulo
        if (TempData["Aluno"] != null)
        {
            // É obrigado a fazer a conversão entre tipos de dados
            var _aluno = TempData["Aluno"] as Aluno;
        }
        return View();
    }
}
Public Function gerarMatricula(p As Pessoa) As ActionResult
   ' Meu objeto Aluno
    Dim _aluno = New Aluno() With { _
                       .Nome = p.Nome, _
                       .Email = p.Email _
                      }

   ' Pertistindo os dados até o próximo requisição
    TempData("Aluno") = _aluno
    ' Fazendo o Redirect entre Controllers
    Return RedirectToAction("gerarMatriculaAluno")
End Function


Public Function gerarMatriculaAluno() As ActionResult
   ' Verificando se aluno é nulo
    If TempData("Aluno") IsNot Nothing Then
      ' É obrigado a fazer a conversão entre tipos de dados
       Dim _aluno = TryCast(TempData("Aluno"), Aluno)
    End If
    Return View()

End Function

 

C#

VB .NET

Obs:   Para manter os dados de um TempData após uma leitura podemos usar o método Keep(). Para remover os dados do TempData usamos o método Remove():

C#
 // Para manter os dados de TempData até a próxima requisição
 TempData.Keep("Aluno");
 // Para remover os dados de TempData desta e da próxima requisição.
 TempData.Remove("Aluno");
VB .NET

 'Para manter os dados de TempData até a próxima requisição
 TempData.Keep("Aluno")
 'Para remover os dados de TempData desta e da próxima requisição.
 TempData.Remove("Aluno")

A seguir temos uma tabela que mostra a atuação dos objetos ViewBag, ViewData e TempData em vários cenários:

Manutenção de Dados ViewData ViewBag TempData
Controller para Controller Não Não Sim
Controller para View Sim Sim Não
View para Controller Não Não Não

Conclusão :

Os objetos ViewData e ViewBag fornecem maneiras de acessar pequenas porções de dados do seu modelo, principalmente entre Controller e Views, no entanto, para dados mais complexos, você pode usar o objeto ViewModel.

O objeto TempData, por outro lado, é voltado especificamente para trabalhar com dados entre redirecionamentos HTTP (Controller para Controller), por isso cuidado ao usar TempData.

Nenhum dos recursos oferece o recurso do Intellisense e por isso te sujeita a erros de digitação; por esse motivo, sempre que possível prefira usar o Model Binding e views tipadas.

Todavia digo-vos a verdade, que vos convém que eu vá; porque, se eu não for, o Consolador não virá a vós; mas, quando eu for, vo-lo enviarei.
E, quando ele vier, convencerá o mundo do pecado, e da justiça e do juízo.

João 16:7-8

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti