2013-02-15 8 views
87

Jak działa narzędzie ASP.NET MVC ViewBag? MSDN mówi, że to tylko Object, co intryguje mnie, jak faktycznie działają "magiczne" właściwości, takie jak ViewBag.Foo i magiczne struny ViewBag["Hello"]?Jak działa ViewBag w ASP.NET MVC?

Ponadto, w jaki sposób mogę go utworzyć i użyć w mojej aplikacji ASP.NET WebForms?

Przykłady byłyby naprawdę docenione!

+0

Koncepcja nie robi” Wydaje się, że są one potrzebne w WebForms, ponieważ strona ma już bezpośredni dostęp do zmiennych w swoim kodzie za plikiem. Podczas gdy w MVC widok nie ma dostępu do niczego w sterowniku oprócz danych przekazywanych w widoku ViewBag lub Modelu. –

Odpowiedz

76

ViewBag jest typu dynamic ale jest wewnętrznie System.Dynamic.ExpandoObject()

jest zadeklarowana następująco:

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

dlatego można zrobić:

ViewBag.Foo = "Bar";

Przykładowy kod obiektu Expander:

public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider 
{ 
    public Dictionary<string, object> objectDictionary; 

    public ExpanderObject() 
    { 
     objectDictionary = new Dictionary<string, object>(); 
    } 
    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; 
     } 
    } 
} 
+1

Dziwne, że [to po prostu mówi 'public object ViewBag {get; } 'na stronie MSDN dla ViewBag] (https://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbase.viewbag (v = vs.118) .aspx), ale jestem kupowanie roszczenia, że ​​jest to ["ExpandoObject"] (https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject (v = vs.110) .aspx). Podoba mi się [porównanie z ViewData tutaj] (http://stackoverflow.com/a/4705446/1028230): "Tak więc w zasadzie [ViewBag] zastępuje magiczne ciągi [w ViewData] ... z magicznymi właściwościami *". ; ^) – ruffin

+0

@ruffin dziwnie dziwne, że mówi 'public object ViewBag {get; } 'na MSDN, kod mówi, że to [' dynamic ViewBag {get .. '] (https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponent.cs), który wewnętrznie jest typu [DynamicViewData] (https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/DynamicViewData.cs) –

+0

[Bardzo ładne] (https: // github.com/aspnet/Mvc/blob/8b1bd343ba56152d2a7e677cf041dc9d62b4033f/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponent.cs#L84). Dziękuję za to. Zrobiłem +1 i mówiłem, że ci uwierzyłem! ; ^) – ruffin

5

Zgodnie z sugestią, ViewBag ma postać System.Dynamic.ExpandoObject. Właściwości w ViewBag są w zasadzie parami KeyValue, w których można uzyskać dostęp do wartości za pomocą klucza. W tym sensie są równoważne:

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

Wiem, czym jest ViewBag, chcę wiedzieć, jak zrobić taki obiekt w WebForms, co oznacza, że ​​chcę ręcznie kodować. –

+0

@Aniket Masz ViewState w formularzach internetowych. –

32

Jest to obiekt dynamiczny, co oznacza, że ​​można dodać właściwości do niej w sterowniku, i przeczytać je później w widoku, bo to w gruncie tworzenia obiektu, jak to zrobić, wykorzystując cecha typu dynamicznego. Zobacz ten MSDN article na dynamikę. Zobacz this article na jego wykorzystanie w stosunku do MVC.

Jeśli chciał to wykorzystać do formularzy internetowych, dodać obiekt do klasy dynamicznej strony baza tak:

public class BasePage : Page 
{ 

    public dynamic ViewBagProperty 
    { 
     get; 
     set; 
    } 
} 

Czy wszystkich stron dziedziczą z tego. Powinieneś być w stanie, w znacznikach ASP.NET, wykonaj następujące czynności:

<%= ViewBagProperty.X %> 

To powinno działać. Jeśli nie, istnieją sposoby obejścia tego problemu.

+0

Wiem, czym jest ViewBag, chcę wiedzieć, jak zrobić taki obiekt w WebForms, co oznacza, że ​​chcę ręcznie kodować. –

+0

Zaktualizowane powyżej z implementacją. –

2

ViewBag jest typu dynamicznego. Więcej, nie możesz wykonać ViewBag["Foo"]. Otrzymasz wyjątek - Nie można zastosować indeksowania z [] do wyrażenia typu "System.Dynamic.DynamicObject".

Wewnętrzna implementacja ViewBag faktycznie przechowuje Foo do ViewData["Foo"] (typ ViewDataDictionary), więc te 2 są wymienne. ViewData["Foo"] i ViewBag.Foo.

I zakres. ViewBag i ViewData służą do przekazywania danych pomiędzy działaniami kontrolera i wyświetlania ich.

4

ViewBag służy do przekazywania danych z akcji kontrolera, aby wyświetlić dane, które są przekazywane. Teraz możesz przekazywać dane za pomocą akcji kontrolera i widoku za pomocą ViewBag lub ViewData. ViewBag: Jest to typ obiektu dynamicznego, co oznacza, że ​​można dynamicznie dodawać nowe pola do widoku i uzyskać dostęp do tych pól w widoku.Musisz zainicjować obiekt viewbacka w momencie tworzenia nowych pól.

np .: 1. Tworzenie ViewBag: ViewBag.FirstName = "John";

  1. Dostęp do widoku: @ ViewBag.FirstName.
-1
public dynamic ViewBag 
{ 
    get 
    { 
     if (_viewBag == null) 
     { 
      _viewBag = new DynamicViewData(() => ViewData); 
     } 

     return _viewBag; 
    } 
} 
+2

Proszę o dodanie kontekstu/komentarza wokół kodu, który udostępniłeś. Pomoże on pytającemu i innym przyszłym czytelnikom lepiej zrozumieć Twój post. – RBT

0

ViewBag jest rodzajem dynamicznej, która pozwala na dynamiczne ustawianie lub uzyskać wartości i pozwala dodać dowolną liczbę dodatkowych pól bez silnie wpisany klasy Pozwalają one na przekazywanie danych z kontrolera do wyświetlenia . W kontrolerze ......

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

W świetle

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

Czego nauczyłem jest to, że obie powinny mieć zapisać dynamiczny Nazwa obiektu tj ViewBag.victor

Powiązane problemy