Jak działa ViewBag w ASP.NET MVC

102

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

Ponadto, jak mogę je utworzyć i używać w mojej aplikacji ASP.NET WebForms?

Przykłady byłyby naprawdę mile widziane!

Aniket Inge
źródło
Ta koncepcja nie wydaje się być potrzebna w formularzach WebForm, ponieważ strona ma już bezpośredni dostęp do zmiennych w kodzie pliku. Podczas gdy w MVC widok nie ma dostępu do niczego w kontrolerze oprócz danych, które są przekazywane w widoku ViewBag lub Model.
Richard Dalton,

Odpowiedzi:

91

ViewBagjest typu, dynamicale jest wewnętrznieSystem.Dynamic.ExpandoObject()

Jest to deklarowane w następujący sposób:

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

dlatego możesz:

ViewBag.Foo = "Bar";

Przykładowy kod obiektu ekspandera:

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;
        }
    }
}
Aniket Inge
źródło
1
Dziwne, że public object ViewBag { get; }na stronie MSDN dla ViewBag jest napisane , ale kupuję twoje twierdzenie, że jest to plikExpandoObject . Podoba mi się tutaj porównanie z ViewData : „ Więc w zasadzie [ViewBag] zastępuje magiczne ciągi [w ViewData]… magicznymi właściwościami ”. ; ^)
ruffin
@ruffin dziwnie dziwne, że public object ViewBag { get; }na MSDN jest napisane , Code mówi, że dynamic ViewBag { get .. wewnętrznie jest typu DynamicViewData
Inge
Bardzo ładnie . Dzięki, że to odkopałeś. Zrobiłem +1 i powiedziałem, że ci wierzyłem! ; ^)
ruffin
2
@ruffin kolejny przypadek, kiedy dokumentacja kłamie, a kod nigdy nie kłamie
Aniket Inge
Czasami jestem pod wrażeniem, gdy znajduję właściwe odpowiedzi na niezbyt jasne / mieszane pytania. Dzięki!
Oscar Ortiz,
33

Jest to obiekt dynamiczny, co oznacza, że ​​możesz dodawać do niego właściwości w kontrolerze i odczytywać je później w widoku, ponieważ zasadniczo tworzysz obiekt tak jak to robisz, cechę typu dynamicznego. Zobacz ten artykuł MSDN dotyczący dynamiki. Zobacz ten artykuł na temat jego użycia w odniesieniu do MVC.

Jeśli chcesz użyć tego dla formularzy internetowych, dodaj właściwość dynamiczną do klasy strony bazowej, tak jak poniżej:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Niech wszystkie Twoje strony to dziedziczą. W znacznikach ASP.NET powinno być możliwe wykonanie:

<%= ViewBagProperty.X %>

To powinno działać. Jeśli nie, są sposoby na obejście tego problemu.

Brian Mains
źródło
Wiem, czym jest ViewBag, chcę wiedzieć, jak stworzyć taki obiekt w formularzach WebForms, co oznacza, że ​​chcę go ręcznie zakodować.
Aniket Inge,
Zaktualizowany powyżej o implementację.
Brian Mains
8

ViewBagJest System.Dynamic.ExpandoObjectjako sugerowane. Właściwości w ViewBagsą zasadniczo KeyValueparami, w których uzyskuje się dostęp do wartości za pomocą klucza. W tym sensie są one równoważne:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
Konstantin Dinev
źródło
Wiem, czym jest ViewBag, chcę wiedzieć, jak stworzyć taki obiekt w formularzach WebForms, co oznacza, że ​​chcę go ręcznie zakodować.
Aniket Inge,
@Aniket Masz ViewState w formularzach internetowych.
Konstantin Dinev,
5

ViewBag służy do przekazywania danych z akcji kontrolera w celu wyświetlenia w celu renderowania przekazywanych danych. Teraz możesz przekazywać dane za pomocą między akcją kontrolera a widokiem przy użyciu ViewBag lub ViewData. ViewBag: Jest to typ obiektu Dynamic, co oznacza, że ​​możesz dynamicznie dodawać nowe pola do widoku i uzyskiwać dostęp do tych pól w widoku. Podczas tworzenia nowych pól musisz zainicjować obiekt Viewbag.

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

  1. Dostęp do widoku: @ ViewBag.FirstName.
Sachin Gaikwad
źródło
3

ViewBag jest typu Dynamic. Więcej, nie możesz zrobić ViewBag["Foo"]. Pojawi się wyjątek - nie można zastosować indeksowania z [] do wyrażenia typu „System.Dynamic.DynamicObject” .

Wewnętrzna implementacja ViewBagfaktycznie przechowuje Foo w 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 między akcjami kontrolera i renderowaniem.

Nenad
źródło
0

ViewBag to typ dynamiczny, który pozwala na dynamiczne ustawianie lub pobieranie wartości i pozwala na dodawanie dowolnej liczby dodatkowych pól bez silnie wpisanej klasy. Pozwalają one na przekazywanie danych z kontrolera do widoku. W sterowniku ......

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

Z uwagi

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

Nauczyłem się, że oba powinny mieć właściwość zapisywania nazwy dynamicznej, tj. ViewBag.victor

Dexter
źródło
-1
public dynamic ViewBag
{
    get
    {
        if (_viewBag == null)
        {
            _viewBag = new DynamicViewData(() => ViewData);
        }

        return _viewBag;
    }
}
kroki
źródło
3
Proszę o dodanie kontekstu / komentarza do udostępnionego kodu. Pomoże pytającemu i innym przyszłym czytelnikom lepiej zrozumieć Twój post.
RBT