Qual é a diferença entre ViewData e ViewBag?

Respostas:

388

Ele usa o recurso dinâmico C # 4.0. Ele atinge o mesmo objetivo que os dados de visualização e deve ser evitado em favor do uso de modelos de visualização com tipos fortes (da mesma forma que os dados de visualização devem ser evitados).

Então, basicamente, ele substitui as cordas mágicas :

ViewData["Foo"]

com propriedades mágicas :

ViewBag.Foo

para o qual você não tem segurança no tempo de compilação.

Continuo a culpar a Microsoft por sempre introduzir esse conceito no MVC.

O nome das propriedades diferencia maiúsculas de minúsculas.

Darin Dimitrov
fonte
11
Com que finalidade você está culpando a microsoft? Se não houver dados de visualização, como poderíamos vincular a lista suspensa do modelo. (Eu não acho que usando o modelo SelectList interior seria uma boa ideia)
Subin Jacob
15
@SubinJacob Você realmente deve fazer uma nova pergunta se quiser uma resposta para isso. Criar uma SelectList é definitivamente o caminho a seguir para criar uma lista suspensa.
MiniRagnarok
25
Eu acho que é um pouco subjetivo. Modelos fortemente tipados são legais e antigos, mas para os cenários em que você obtém rapidamente uma visualização em funcionamento, o ViewBag e similares executam o trabalho mais rapidamente do que Controller, View, Model, AutoMapper to ViewModel, etc.
Craig Brett,
11
@Darin, por que você "culpa" a Microsoft por apresentar isso? É apenas uma ferramenta dada aos desenvolvedores. Se você sabe o que está fazendo, pode tirar o máximo proveito disso. Se você não gosta ou se sente mais propenso a erros, simplesmente não o use. :)
Bilal Fazlani
5
Como você sugere passar dados entre parciais e layout? As pessoas culpam quando não vêem a imagem completa. Eu imagino que você tenha controladores de base e modelos de visualização de base ou objetos estáticos / singletons em todos os lugares. Adivinhe, é melhor aprender a usar os dados de exibição e se culpar por usar a ferramenta errada para o trabalho.
Bart Calixto
42

ViewBag internamente propriedades do são armazenadas como pares de nome / valor no dicionário do ViewData .

Nota: na maioria das versões de pré-lançamento do MVC 3, a propriedade ViewBag foi nomeada ViewModel, conforme observado neste trecho das notas de versão do MVC 3:

(editado em 08-10-12) Foi sugerido que eu publicasse a fonte dessas informações que publiquei, aqui está a fonte: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

Os controladores MVC 2 suportam uma propriedade ViewData que permite passar dados para um modelo de exibição usando uma API de dicionário com ligação tardia. No MVC 3, você também pode usar uma sintaxe um pouco mais simples com a propriedade ViewBag para atingir o mesmo objetivo. Por exemplo, em vez de escrever ViewData ["Message"] = "text", você pode escrever ViewBag.Message = "text". Você não precisa definir nenhuma classe fortemente tipada para usar a propriedade ViewBag. Por se tratar de uma propriedade dinâmica, você pode simplesmente obter ou definir propriedades e as resolverá dinamicamente no tempo de execução. Internamente, as propriedades do ViewBag são armazenadas como pares de nome / valor no dicionário do ViewData. (Nota: na maioria das versões de pré-lançamento do MVC 3, a propriedade ViewBag foi denominada propriedade ViewModel.)

Rich Bianco
fonte
A pergunta faz a diferença entre ViewDatae ViewBagnão sobre ViewModel.
Matthew Flaschen
Obrigado pelo aviso Matthew Flaschen, eu tive um erro de digitação na resposta e a corrigi, agora lê "ViewData" em vez de ViewModel, o que foi um erro. :)
rico Bianco
Agora está incorreto. Nenhum foi renomeado para o outro. Ambos ainda existem. Um é dynamice suporta ViewBag.Message. Um usa a ViewData["Message"]sintaxe antiga .
Matthew Flaschen
11
+1 Mas, de qual fonte você está citando ...? Realmente deve fornecer um link.
Sam
11
Obrigado Sam pela sugestão. Eu adicionei um link para a fonte original.
Ricos Bianco
34

ViewBag vs ViewData no MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

Semelhanças entre ViewBag e ViewData:

Ajuda a manter os dados quando você passa do controlador para a exibição. Usado para passar dados do controlador para a visualização correspondente. Vida curta significa que o valor se torna nulo quando o redirecionamento ocorre. Isso ocorre porque o objetivo deles é fornecer uma maneira de se comunicar entre controladores e visualizações. É um mecanismo de comunicação dentro da chamada do servidor.

Diferença entre ViewBag e ViewData:

ViewData é um dicionário de objetos que é derivado da classe ViewDataDictionary e acessível usando cadeias de caracteres como chaves. O ViewBag é uma propriedade dinâmica que tira proveito dos novos recursos dinâmicos do C # 4.0. O ViewData requer a conversão de tipos de dados complexos e verifica valores nulos para evitar erros. O ViewBag não requer conversão de tipo para dados complexos.

Exemplo de ViewBag e ViewData:

public ActionResult Index()
{   
    ViewBag.Name = "Arun Prakash";   
    return View();
}

public ActionResult Index()
{  
    ViewData["Name"] = "Arun Prakash";  
    return View();
}   

Chamando no modo de exibição

@ViewBag.Name    
@ViewData["Name"]
Arun Prakash
fonte
7
sua resposta indicam typecastingmas você não mostrar como typecasting é realizada
Alex
31

ViewData: Requer conversão de tipo para tipos de dados complexos e verifica valores nulos para evitar erros.

ViewBag: Não requer conversão de tipo para tipos de dados complexos.

Considere o seguinte exemplo:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var emp = new Employee
        {
            EmpID=101,
            Name = "Deepak",
            Salary = 35000,
            Address = "Delhi"
        };

        ViewData["emp"] = emp;
        ViewBag.Employee = emp;

        return View(); 
    }
}

E o código para Viewé o seguinte:

@model MyProject.Models.EmpModel;
@{ 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
 ViewBag.Title = "Welcome to Home Page";
 var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>
Naresh Ravlani
fonte
6
me ajude a entender, mas acho que há um erro. isso <h4>@ViewBag.emp.Name</h4> deve mudar para<h4>@ViewBag.Employee.Name</h4>
Benny Margalit
24

Todas as respostas sugerem que ViewBage / ou ViewDataé para passar dados a partir Controllerde Viewsque é desinformação. ambos são muito úteis para passar dados de Views para Layout ou Parciais para Views (ou ViewComponents, etc.) Não é exclusivo do controlador.

como a amostra asp.net padrão, faça isso na página de layout:

<title>@ViewData["Title"] - MyApp</title>

e de qualquer forma

ViewData["Title"] = "Details";

Então, perguntando: "qual é a diferença entre ViewBage ViewData?"

A diferença mais notável ViewDataé um dicionário fortemente tipado, enquanto ViewBagé um tipo dinâmico.

Observe que os dados dentro são os mesmos

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";

Quando usar um ou outro?

  • ViewBagnão suporta nomes C # inválidos. você não pode acessar ViewData["Key With Space"]comViewBag
  • ViewBag.Something é dinâmico e você pode ter problemas ao chamar métodos (como métodos de extensão) que precisam saber o parâmetro exato no momento da compilação.
  • ViewBag pode verificar a limpeza sintática nula: ViewBag.Person?.Name
  • ViewDatatenha todas as propriedades de um dicionário como ContainsKey, Addetc., para que você possa ViewData.Add("somekey", "somevalue")ter em mente que isso pode gerar exceções.
  • O uso ViewDatade visualizações precisa TypeCasting, enquanto ViewBagnão.

Conhecer as diferenças sutis, usar uma ou outra é muito mais uma preferência de sabor.

Normalmente você pode pensar ViewBag.AnyKeyem um apelido deViewData["AnyKey"]

Bart Calixto
fonte
11
Esta deve ser uma resposta aceita!
Prashant Pimpale
14

Posso recomendar que você também não use?

Se você deseja "enviar" dados para a sua tela, envie um objeto fortemente tipado (AKA ViewModel), porque é mais fácil testar.

Se você vincular a algum tipo de "Modelo" e tiver itens aleatórios "viewbag" ou "viewdata", isso tornará o teste automatizado muito difícil.

Se você os estiver usando, considere como poderá reestruturar e apenas usar o ViewModels.

nootn
fonte
4
Ignorando o princípio "compilador é o primeiro teste de unidade", como um modelo de exibição estaticamente digitado torna seu código mais testável que um tipo dinâmico? Embora o requisito para testes seja mais importante em uma solução de tipo dinâmico, se as duas soluções implementarem o mesmo número e tipo de teste, você não perderá nada.
Darren Lewis
Eu concordo, é um pouco vago. Talvez o intellisense esteja envolvido.
Joshua Ramirez
11
Um exemplo seria zombaria. Se você deseja testar a unidade de uma ação do controlador, é mais fácil criar um objeto "simulado" para repassar e afirmar em vez de tentar afirmar que alguma sequência foi adicionada a algum dicionário ou que algum campo dinâmico está definido com algum valor - é um conceito semelhante aos contratos de serviço com um objeto "Solicitação" e um "Resposta", em vez de usar vários parâmetros.
nootn
como você passaria os dados do modo de exibição para o layout se não estivesse usando? -1
Bart Calixto
Como isso é uma resposta?
JSON
6

viewdata: é um dicionário usado para armazenar dados entre o View e o controller, você precisa converter o objeto de dados do view no seu modelo correspondente na view para poder recuperar dados dele ...

ViewBag: é uma propriedade dinâmica semelhante ao trabalho com os dados da visualização. No entanto, é melhor porque não precisa ser convertida em seu modelo correspondente antes de usá-la na visualização ...

Ahmed Elbatt
fonte
4

Abaixo está a diferença ponto a ponto sobre ViewData, ViewBag, TempData & Session. Crédito / cópia askforprogram.in , Siga o link do exemplo de código que não mencionei aqui.

  1. ViewData no MVC

    • ViewData é propriedade da classe ControllerBase.
    • ViewData é um tipo de objeto de dicionário.
    • ViewData é uma coleção de dicionário de valores-chave.
    • O ViewData foi introduzido na versão MVC 1.0.
    • O ViewData funciona com o .Net framework 3.5 e superior.
    • Precisa fazer a conversão de tipo de código enquanto enumera.
    • O objeto ViewData mantém os dados apenas para solicitação atual.
  2. ViewBag no MVC

    • ViewBag é propriedade da classe ControllerBase.
    • ViewBag é um tipo de objeto dinâmico.
    • ViewBag é um tipo de objeto.
    • O ViewBag foi introduzido na versão MVC 3.0.
    • O ViewBag funciona com o .Net framework 4.0 e superior.
    • O ViewBag usa a propriedade e lida com ela, portanto, não é necessário fazer conversão de tipo enquanto enumera.
    • O objeto ViewBag mantém os dados apenas para solicitação atual.
  3. TempData no MVC

    • TempData é propriedade da classe ControllerBase.
    • TempData é um tipo de objeto de dicionário.
    • TempData é uma coleção de dicionário de valores-chave.
    • TempData foi introduzido na versão MVC 1.0.
    • O TempData funciona com o .Net framework 3.5 e superior.
    • Precisa fazer a conversão de tipo de código enquanto enumera.
    • O objeto TempData é usado para dados entre a solicitação atual e a solicitação subsequente.
  4. Sessão no MVC

    • Session é propriedade do Controller (Abstract Class).
    • Session é um tipo de HttpSessionStateBase.
    • Sessão é uma coleção de dicionário de valores-chave.
    • A sessão foi introduzida na versão MVC 1.0.
    • TempData trabalha com .Net framework 1.0 e acima.
    • Precisa fazer a conversão de tipo de código enquanto enumera.
    • O objeto Session mantém dados para todas as solicitações. Válido para todos os pedidos, nunca expira.
Nirju
fonte
1

Embora você possa não ter uma vantagem técnica em escolher um formato em detrimento do outro, esteja ciente de algumas diferenças importantes entre as duas sintaxes. Uma diferença óbvia é que o ViewBag funciona apenas quando a chave que você está acessando é um identificador C # válido. Por exemplo, se você colocar um valor em ViewData ["Key With Spaces"], não poderá acessar esse valor usando o ViewBag porque o código não será compilado. Outra questão importante a considerar é que você não pode passar valores dinâmicos como parâmetros para métodos de extensão. O compilador C # deve conhecer o tipo real de cada parâmetro no momento da compilação para escolher o método de extensão correto. Se algum parâmetro for dinâmico, a compilação falhará. Por exemplo, esse código sempre falha: @ Html.TextBox ("name", ViewBag.Name). Para contornar isso, use ViewData ["Name"

user2211290
fonte
0
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 
dilipkumar1007
fonte
0

Dessa forma, podemos fazer com que use os valores para passar as informações entre o controlador para outra página com TEMP DATA

user3141962
fonte
0

Uma diferença principal que notei entre o ViewData e o ViewBag é:

ViewData: ele retornará o objeto, não importa o que você atribuiu a isso e precisará retornar novamente ao tipo original.

ViewBag: é inteligente o suficiente retornar o tipo exato do que você atribuiu a ele, não importa o tempo em que você tenha atribuído o tipo simples (por exemplo, int, string etc.) ou complexo.

Ex: código do controlador.

 namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Products p1 = new Products();
            p1.productId = 101;
            p1.productName = "Phone";
            Products p2 = new Products();
            p2.productId = 102;
            p2.productName = "laptop";

            List<Products> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}

Ver código.

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

Tela de saída.

insira a descrição da imagem aqui

Bhanu Pratap
fonte
0

Ver dados

  1. ViewData é usado para passar dados do controlador para visualizar
  2. ViewData é derivado da classe ViewDataDictionary e é basicamente um objeto Dictionary, ieKeys and Values, em que Keys são String e Values ​​serão objetos.
  3. A digitação de dados é necessária durante a recuperação dos dados do ViewData devido ao tipo de dados Object e também à verificação de valor nulo antes da conversão de tipos, caso contrário, o aplicativo será interrompido. Se o redirecionamento ocorrer, seu valor se tornará nulo. Leia a diferença completa entre TempData ViewData e View Bag

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html

Jatin Phulera
fonte
0
Ver dados
  1. ViewData é usado para passar dados do controlador para visualizar
  2. É derivado da classe ViewDataDictionary
  3. Está disponível apenas para a solicitação atual
  4. Requer conversão de tipo para dados complexos e verifica valores nulos para evitar erros
  5. Se o redirecionamento ocorrer, seu valor se tornará nulo
ViewBag
  1. O ViewBag também é usado para passar dados do controlador para a respectiva visualização
  2. ViewBag é uma propriedade dinâmica que tira proveito dos novos recursos dinâmicos do C # 4.0
  3. Também está disponível apenas para a solicitação atual
  4. Se o redirecionamento ocorrer, seu valor se tornará nulo
  5. Não requer conversão de tipo para dados complexos
Er Pravin Suthar
fonte
0

Aqui, ViewData e ViewBag são usados ​​para passar dados do Controller para o View .

1. ViewData

- ViewData é um objeto de dicionário derivado da classe ViewDataDictonary .

- Os dados permitem apenas uma solicitação, os valores do ViewData são limpos quando ocorre o redirecionamento da página.

- O valor ViewData deve ser digitado cate antes do uso.

Exemplo: No Controlador

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

Em vista

@ViewData["Message"];

- Com ViewData é um par como Chave e Valor , Mensagem é Chave e no valor da vírgula invertida é Valor.

- Os dados são simples, portanto, não podemos usar a conversão de tipos aqui se os dados forem complexos, usando a conversão de tipos.

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

- Os dados do In View podem ser extraídos como

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

--O ViewBag usa o recurso dinâmico. O wrapper do ViewBag em torno do ViewData.

- No ViewBag, é necessária a conversão do tipo.

- Igual a ViewData, se o redirecionamento ocorrer, o valor se tornará nulo.

Exemplo:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

Em vista

@ViewBag.vbMessage

--Para o tipo complexo, use o ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

- Os dados do In View podem ser extraídos como

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

- a principal diferença é que o ViewBag não exige a conversão de texto, mas o ViewData é necessário a conversão de texto .

Brijesh Mavani
fonte
-1

ViewBag e ViewData são dois meios que são usados ​​para passar informações do controlador para exibição no ASP.Net MVC. O objetivo do uso de ambos os mecanismos é fornecer a comunicação entre o controlador e o View. Ambos têm vida curta, que é o valor de ambos se torna nulo quando o redirecionamento ocorre, ou seja, quando a página é redirecionada da página de origem (onde definimos o valor de ViewBag ou ViewData) para a página de destino, tanto o ViewBag quanto o ViewData torna-se nulo.

Apesar de ter essas semelhanças, ambos (ViewBag e ViewData) são duas coisas diferentes, se falarmos sobre a implementação de ambos. As diferenças são as seguintes:

1.) Se analisarmos ambas as implementações, descobriremos que o ViewData é uma estrutura de dados do dicionário - Dicionário de Objetos derivada do ViewDataDictionary e acessível usando cadeias de caracteres como Chaves para esses valores, enquanto o ViewBag faz uso dos recursos dinâmicos introduzidos no C # 4.0 e é uma propriedade dinâmica.

2.) Ao acessar os valores do ViewData, precisamos digitar os valores (tipos de dados), pois eles são armazenados como Objetos no dicionário do ViewData, mas não existe tal necessidade se estivermos acessando o valor no caso do ViewBag.

3.) No ViewBag, podemos definir o valor assim:

      ViewBag.Name = "Value"; 

e pode acessar da seguinte maneira:

          @ViewBag.Name

Enquanto no caso de ViewData, os valores podem ser definidos e acessados ​​da seguinte maneira: Configurando ViewData da seguinte maneira:

ViewData["Name"] = "Value";

e acessando valor como este

 @ViewData["Name"] 

Para mais detalhes clique aqui:

Abhishek Gahlout
fonte
2
desculpe, eu votei mal, mas esta resposta leva vários parágrafos para não dizer nada útil. A coisa útil que faltava na resposta aceita seria a frase "viewbag é um invólucro dinâmico em torno de viewdata", que eu aprendi com rachelappel.com/…
Chris F Carroll