Як працює ViewBag в ASP.NET MVC


102

Як працює ASP.NET MVC ViewBag? MSDN каже, що це саме те Object, що мене заінтригує, як насправді працюють "магічні" властивості, такі як ViewBag.Fooі магічні рядки ViewBag["Hello"]?

Крім того, як я можу зробити його і використати його в додатку ASP.NET WebForms?

Приклади були б дуже вдячні!


Ця концепція, здається, не потрібна в WebForms, оскільки сторінка вже має прямий доступ до змінних у своєму коді за файлом. Тоді як у MVC представлення не має доступу до нічого в контролері, крім даних, що передаються для перегляду ViewBag або Model.
Річард Далтон

Відповіді:


91

ViewBagтипу, dynamicале є внутрішньоSystem.Dynamic.ExpandoObject()

Це оголошено так:

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

ось чому ви можете зробити:

ViewBag.Foo = "Bar";

Код об'єкта розширювача зразка:

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
Weird , що він просто говорить , що public object ViewBag { get; }на сторінці MSDN для ViewBag , але я купую ваші претензії , що це . Мені подобається порівняння з ViewData тут : " Отже, в основному [ViewBag] замінює магічні рядки [у ViewData] ... магічними властивостями ". ; ^)ExpandoObject
ruffin

@ruffin дивно дивно, що він говорить public object ViewBag { get; }про MSDN, Код говорить, що це dynamic ViewBag { get .. внутрішньо типу DynamicViewData
Inge

Дуже приємно . Дякуємо, що викопали це. І я зробив +1 і сказав, що вірю тобі! ; ^)
ruffin

2
@ruffin Ще один випадок, коли документація лежить, а код ніколи не бреше
Aniket Inge

Іноді я вражаю, коли знаходжу правильні відповіді на не такі чіткі / змішані питання. Дякую!
Оскар Ортіз

33

Це динамічний об'єкт, тобто ви можете додати до нього властивості в контролері та прочитати їх згодом у представленні, тому що ви, по суті, створюєте об'єкт як і ви, особливість динамічного типу. Дивіться цю статтю MSDN про динаміку. Дивіться цю статтю про його використання стосовно MVC.

Якщо ви хочете використати це для веб-форм, додайте динамічну властивість до базового класу сторінки таким чином:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Нехай усі ваші сторінки успадковуються від цього. Ви повинні мати змогу у своїй розмітці ASP.NET робити:

<%= ViewBagProperty.X %>

Це має спрацювати. Якщо ні, то є способи обійти це.


Я знаю, що таке ViewBag, я хочу знати, як зробити такий об’єкт у WebForms, а це означає, що я хочу його кодувати вручну.
Aniket Inge

Оновлено вище з реалізацією.
Брайан Мейнс

8

ViewBagЄ System.Dynamic.ExpandoObjectяк запропоновано. Властивості в, по ViewBagсуті, KeyValueпари, де ви отримуєте доступ до значення за допомогою ключа. У цьому сенсі вони рівнозначні:

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

Я знаю, що таке ViewBag, я хочу знати, як зробити такий об’єкт у WebForms, а це означає, що я хочу його кодувати вручну.
Aniket Inge

@Aniket У вас є веб-форми ViewState.
Костянтин Дінев

5

ViewBag використовується для передачі даних з Controller Action для перегляду для передачі даних, що передаються. Тепер ви можете передавати дані, використовуючи «Контролер Дія» та «Перегляд», використовуючи ViewBag або ViewData. ViewBag: Це тип об'єкта Dynamic, це означає, що ви можете додавати нові поля в мішок перегляду динамічно та отримувати доступ до цих полів у View. Потрібно ініціалізувати об’єкт вікна перегляду під час створення нових полів.

наприклад: 1. Створення ViewBag: ViewBag.FirstName = "Джон";

  1. Доступ до перегляду: @ ViewBag.FirstName.

3

ViewBag має динамічний тип. Більше того, ви не можете зробити ViewBag["Foo"]. Ви отримаєте виняток - Неможливо застосувати індексацію з [] до виразу типу "System.Dynamic.DynamicObject" .

Внутрішня реалізація ViewBagфактично зберігає Foo у ViewData["Foo"](тип ViewDataDictionary), тому ці 2 є взаємозамінними. ViewData["Foo"]іViewBag.Foo .

І сфера застосування. ViewBag та ViewData мають намір передавати дані між діями контролера та переглядати його.


0

ViewBag - це динамічний тип, який дозволяє динамічно встановлювати або отримувати значення та дозволяє додавати будь-яку кількість додаткових полів без сильно набраного класу. Вони дозволяють передавати дані з контролера для перегляду. У контролері ......

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

У виду

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

Я дізнався, що обидва повинні мати властивість збереження динамічного імені, тобто ViewBag.victor


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

        return _viewBag;
    }
}

3
Я прошу вас, будь ласка, додайте контекст / коментар навколо коду, яким ви поділилися. Це допоможе запитувачу та іншим майбутнім читачам краще зрозуміти вашу публікацію.
RBT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.