How ViewBag in ASP.NET MVC works

前端 未结 7 1983
清酒与你
清酒与你 2020-11-28 04:38

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.F

相关标签:
7条回答
  • 2020-11-28 04:57
    public dynamic ViewBag
    {
        get
        {
            if (_viewBag == null)
            {
                _viewBag = new DynamicViewData(() => ViewData);
            }
    
            return _viewBag;
        }
    }
    
    0 讨论(0)
  • 2020-11-28 05:00

    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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 05:00

    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.

    0 讨论(0)
  • 2020-11-28 05:00

    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";
    
    0 讨论(0)
  • 2020-11-28 05:08

    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

    0 讨论(0)
  • 2020-11-28 05:18

    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.

    0 讨论(0)
提交回复
热议问题