Como o ViewBag no asp.net MVC funciona

Como o ViewBag da ASP.NET MVC funciona? MSDN diz que é apenas um Object , o que me intriga, como funcionam as propriedades “mágicas” como ViewBag.Foo e as mágicas ViewBag["Hello"] ?

Além disso, como posso fazer um e usá-lo no meu aplicativo ASP.NET WebForms?

Exemplos seriam muito apreciados!

ViewBag é do tipo dynamic , mas é internamente um System.Dynamic.ExpandoObject()

É declarado assim:

dynamic ViewBag = new System.Dynamic.ExpandoObject();

é por isso que você pode fazer:

ViewBag.Foo = "Bar";

Um Exemplo de Código de Objeto de Expansor:

 public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider { public Dictionary objectDictionary; public ExpanderObject() { objectDictionary = new Dictionary(); } public override bool TryGetMember(GetMemberBinder binder, out object result) { object val; if (objectDictionary.TryGetValue(binder.Name, out val)) { result = val; return true; } result = null; return false; } public override bool TrySetMember(SetMemberBinder binder, object value) { try { objectDictionary[binder.Name] = value; return true; } catch (Exception ex) { return false; } } } 

É um object dynamic, o que significa que você pode adicionar propriedades a ele no controlador e lê-las mais tarde na visualização, porque você está essencialmente criando o object como faz, um recurso do tipo dynamic. Veja este artigo do MSDN sobre dinâmicas. Veja este artigo sobre seu uso em relação ao MVC.

Se você quiser usar isso para formulários da web, adicione uma propriedade dinâmica a uma class de página de base da seguinte forma:

 public class BasePage : Page { public dynamic ViewBagProperty { get; set; } } 

Ter todas as suas páginas herdadas disso. Você deve poder, em sua marcação ASP.NET, fazer:

 <%= ViewBagProperty.X %> 

Isso deve funcionar. Se não, existem maneiras de contornar isso.

O ViewBag é um System.Dynamic.ExpandoObject como sugerido. As propriedades no ViewBag são essencialmente pares KeyValue , onde você acessa o valor pela chave. Nesse sentido, são equivalentes:

 ViewBag.Foo = "Bar"; ViewBag["Foo"] = "Bar"; 

O ViewBag é usado para transmitir dados do Controller Action para exibir os dados que estão sendo transmitidos. Agora você pode passar dados usando entre a ação do controlador e a vista usando ViewBag ou ViewData. ViewBag: É o tipo de object Dinâmico, o que significa que você pode adicionar novos campos para ver a bagagem dinamicamente e acessar esses campos na Vista. Você precisa inicializar o object de viewbag no momento da criação de novos campos.

Por exemplo: 1. Criando ViewBag: ViewBag.FirstName = “John”;

  1. Acessando a visualização: @ ViewBag.FirstName.

O ViewBag é do tipo dynamic. Mais, você não pode fazer ViewBag["Foo"] . Você obterá a exceção – Não é possível aplicar a indexação com [] a uma expressão do tipo ‘System.Dynamic.DynamicObject’ .

A implementação interna do ViewBag na verdade armazena Foo em ViewData["Foo"] (tipo de ViewDataDictionary), então esses 2 são intercambiáveis. ViewData["Foo"] e ViewBag.Foo .

E escopo. ViewBag e ViewData são necessários para passar dados entre as ações do Controller e View it.

ViewBag é um tipo dynamic que permite que você defina dinamicamente ou obtenha valores e permite que você adicione qualquer número de campos adicionais sem uma class fortemente tipificada. Eles permitem que você passe dados do controlador para a visualização. No controlador ……

 public ActionResult Index() { ViewBag.victor = "My name is Victor"; return View(); } 

Em vista

 @foreach(string a in ViewBag.victor) { ......... } 

O que eu aprendi é que ambos devem ter a propriedade de salvar nome dynamic, por exemplo, ViewBag.victor

 public dynamic ViewBag { get { if (_viewBag == null) { _viewBag = new DynamicViewData(() => ViewData); } return _viewBag; } }