Как работает ViewBag в ASP.NET MVC

Как работает ASP.NET MVC ViewBag? MSDN говорит, что это всего лишь Object, что меня интригует, как на самом деле работают свойства "Magic", такие как ViewBag.Foo и магические строки ViewBag["Hello"]?

Также, как я могу создать его и использовать в своем приложении ASP.NET WebForms?

Примеры были бы очень оценены!

Ответ 1

ViewBag имеет тип dynamic, но внутренне System.Dynamic.ExpandoObject()

Он объявляется следующим образом:

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

поэтому вы можете:

ViewBag.Foo = "Bar";

Код объекта Expander 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;
        }
    }
}

Ответ 2

Это динамический объект, то есть вы можете добавлять к нему свойства в контроллере и читать их позже в представлении, потому что вы по существу создаете объект, как вы, особенность динамического типа. См. Статью MSDN о динамике. См. в этой статье об использовании в отношении MVC.

Если вы хотите использовать это для веб-форм, добавьте динамическое свойство в класс базовой страницы, например:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Устранить все ваши страницы. Вы должны иметь возможность в своей разметке ASP.NET:

<%= ViewBagProperty.X %>

Это должно сработать. Если нет, есть способы обойти это.

Ответ 3

ViewBag - это System.Dynamic.ExpandoObject, как было предложено. Свойства в ViewBag являются по существу KeyValue парами, где вы получаете доступ к значению с помощью ключа. В этом смысле они эквивалентны:

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

Ответ 4

ViewBag используется для передачи данных из действия контроллера для просмотра для передачи передаваемых данных. Теперь вы можете передавать данные, используя действия Controller Action и View, либо с помощью ViewBag, либо ViewData. ViewBag: тип динамического объекта, что означает, что вы можете добавлять новые поля для динамического просмотра и получать доступ к этим полям в представлении. Вам нужно инициализировать объект viewbag во время создания новых полей.

например: 1. Создание ViewBag: ViewBag.FirstName = "Джон";

  1. Доступ к просмотру: @ViewBag.FirstName.

Ответ 5

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

Внутренняя реализация ViewBag фактически сохраняет Foo в ViewData["Foo"] (тип ViewDataDictionary), поэтому эти 2 являются взаимозаменяемыми. ViewData["Foo"] и ViewBag.Foo.

И область. ViewBag и ViewData предназначены для передачи данных между действиями Controller и View it render.

Ответ 6

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

        return _viewBag;
    }
}