How ViewBag in ASP.NET MVC works
Asked Answered
E

7

106

How does the ASP.NET MVC's ViewBag work? MSDN says it is just an Object, which intrigues me, how does "Magic" properties such as ViewBag.Foo and magic strings ViewBag["Hello"] actually work?

Also, how can I make one and use it in my ASP.NET WebForms app?

Examples would be really appreciated!

Expressivity answered 15/2, 2013 at 13:39 Comment(1)
The concept doesn't seem to be needed in WebForms as the page already has direct access to variables in it's code behind file. Whereas in MVC the view doesn't have access to anything in the controller apart from data that is passed in view the ViewBag or Model.Lentil
E
93

ViewBag is of type dynamic but, is internally an System.Dynamic.ExpandoObject()

It is declared like this:

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

which is why you can do :

ViewBag.Foo = "Bar";

A Sample Expander Object Code:

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;
        }
    }
}
Expressivity answered 20/2, 2013 at 17:15 Comment(5)
Weird that it just says public object ViewBag { get; } on the MSDN page for ViewBag, but I'm buying your claim that it's an ExpandoObject. I like the comparison with ViewData here: "So basically [ViewBag] replaces magic strings [in ViewData]... with magic properties". ;^)Impersonate
@Impersonate weirdly strange that it says public object ViewBag { get; } on MSDN, Code says it's dynamic ViewBag { get .. which internally is of type DynamicViewDataExpressivity
Very nice. Thanks for digging that up. And I did +1 & say that I believed you! ;^)Impersonate
@Impersonate another case of when the documentation lies and the code never liesExpressivity
Sometimes I'm impressed when finding the right answers on not so clear/mixed questions. Thanks!Painkiller
P
34

It's a dynamic object, meaning you can add properties to it in the controller, and read them later in the view, because you are essentially creating the object as you do, a feature of the dynamic type. See this MSDN article on dynamics. See this article on it's usage in relation to MVC.

If you wanted to use this for web forms, add a dynamic property to a base page class like so:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Have all of your pages inherit from this. You should be able to, in your ASP.NET markup, do:

<%= ViewBagProperty.X %>

That should work. If not, there are ways to work around it.

Proprietary answered 15/2, 2013 at 13:43 Comment(2)
I know what ViewBag is, I want to know how to make an object like that in WebForms, which means I want to hand-code it.Expressivity
Updated above with an implementation.Proprietary
M
8

The ViewBag is an System.Dynamic.ExpandoObject as suggested. The properties in the ViewBag are essentially KeyValue pairs, where you access the value by the key. In this sense these are equivalent:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
Marrow answered 15/2, 2013 at 13:42 Comment(2)
I know what ViewBag is, I want to know how to make an object like that in WebForms, which means I want to hand-code it.Expressivity
@Aniket You have a ViewState in web forms.Marrow
P
6

ViewBag is used to pass data from Controller Action to view to render the data that being passed. Now you can pass data using between Controller Action and View either by using ViewBag or ViewData. ViewBag: It is type of Dynamic object, that means you can add new fields to viewbag dynamically and access these fields in the View. You need to initialize the object of viewbag at the time of creating new fields.

e.g: 1. Creating ViewBag: ViewBag.FirstName="John";

  1. Accessing View: @ViewBag.FirstName.
Pachston answered 20/11, 2015 at 4:30 Comment(0)
C
3

ViewBag is of type dynamic. More, you cannot do ViewBag["Foo"]. You will get exception - Cannot apply indexing with [] to an expression of type 'System.Dynamic.DynamicObject'.

Internal implementation of ViewBag actually stores Foo into ViewData["Foo"] (type of ViewDataDictionary), so those 2 are interchangeable. ViewData["Foo"] and ViewBag.Foo.

And scope. ViewBag and ViewData are ment to pass data between Controller's Actions and View it renders.

Candiot answered 15/2, 2013 at 13:52 Comment(0)
E
1

ViewBag is a dynamic type that allow you to dynamically set or get values and allow you to add any number of additional fields without a strongly-typed class They allow you to pass data from controller to view. In controller......

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

In view

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

What I have learnt is that both should have the save dynamic name property ie ViewBag.victor

Eurus answered 18/1, 2018 at 10:56 Comment(0)
S
-1
public dynamic ViewBag
{
    get
    {
        if (_viewBag == null)
        {
            _viewBag = new DynamicViewData(() => ViewData);
        }

        return _viewBag;
    }
}
Sistrunk answered 28/12, 2016 at 6:11 Comment(1)
I request you to please add some context/commentary around the code you have shared. It will help the asker and other future readers to understand your post better.Leadin

© 2022 - 2024 — McMap. All rights reserved.