Eu vi o ViewBag
no MVC 3. Como isso é diferente do que ViewData
no MVC 2?
Eu vi o ViewBag
no MVC 3. Como isso é diferente do que ViewData
no MVC 2?
Respostas:
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.
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.)
ViewData
e ViewBag
não sobre ViewModel
.
dynamic
e suporta ViewBag.Message
. Um usa a ViewData["Message"]
sintaxe antiga .
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"]
typecasting
mas você não mostrar como typecasting é realizada
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>
<h4>@ViewBag.emp.Name</h4>
deve mudar para<h4>@ViewBag.Employee.Name</h4>
Todas as respostas sugerem que ViewBag
e / ou ViewData
é para passar dados a partir Controller
de Views
que é 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 ViewBag
e 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?
ViewBag
nã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
ViewData
tenha todas as propriedades de um dicionário como ContainsKey
, Add
etc., para que você possa ViewData.Add("somekey", "somevalue")
ter em mente que isso pode gerar exceções.ViewData
de visualizações precisa TypeCasting, enquanto ViewBag
não.Conhecer as diferenças sutis, usar uma ou outra é muito mais uma preferência de sabor.
Normalmente você pode pensar ViewBag.AnyKey
em um apelido deViewData["AnyKey"]
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.
Existem algumas diferenças sutis que significam que você pode usar o ViewData e o ViewBag de maneiras ligeiramente diferentes da exibição. Uma vantagem é destacada neste post http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx e mostra que a transmissão pode ser evitado no exemplo usando o ViewBag em vez de ViewData.
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 ...
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.
ViewData no MVC
ViewBag no MVC
TempData no MVC
Sessão no MVC
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"
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
Dessa forma, podemos fazer com que use os valores para passar as informações entre o controlador para outra página com TEMP DATA
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 @item.productName</li>
}
</ul>
Tela de saída.
Ver dados
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
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 .
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: