ASP.NET MVC中的ViewBag如何工作

Ani*_*nge 96 asp.net asp.net-mvc viewbag

ASP.NET MVC是如何ViewBag工作的?MSDN说它只是一个Object引起我兴趣的,"魔法"属性如ViewBag.Foo魔法字符串ViewBag["Hello"]实际上是如何工作的?

另外,我如何制作一个并在我的ASP.NET WebForms应用程序中使用它?

实例真的很感激!

Ani*_*nge 88

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是 [它只是说‘公共对象 ViewBag { get; }` 在 ViewBag 的 MSDN 页面上](https://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbase.viewbag(v=vs.118).aspx),但我购买您声称它是 [一个`ExpandoObject`](https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject(v=vs.110).aspx)。我喜欢 [此处与 ViewData 的比较](http://stackoverflow.com/a/4705446/1028230):“*所以基本上 [ViewBag] 用魔术属性替换了 [ViewData] 中的魔术字符串*”。;^) (2认同)
  • @ruffin文档所在的另一个案例,代码永远不存在 (2认同)

Bri*_*ins 32

它是一个动态对象,这意味着您可以在控制器中为其添加属性,并在视图中稍后读取它们,因为您实际上是在创建对象,这是动态类型的一个特性.请参阅此MSDN关于动态的文章.请参阅 此文章,了解它与MVC相关的用法.

如果要将其用于Web表单,请将动态属性添加到基页类,如下所示:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

让您的所有页面都继承自己.您应该能够在ASP.NET标记中执行以下操作:

<%= ViewBagProperty.X %>
Run Code Online (Sandbox Code Playgroud)

这应该工作.如果没有,有办法解决它.


Kon*_*nev 8

ViewBagSystem.Dynamic.ExpandoObject建议的.其中的属性ViewBag基本上是KeyValue对,您可以通过键访问该值.在这个意义上,这些是等价的:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
Run Code Online (Sandbox Code Playgroud)


Sac*_*wad 5

ViewBag用于从Controller Action传递数据以查看以呈现正在传递的数据。现在,您可以使用ViewBag或ViewData在Controller Action和View之间传递数据。ViewBag:这是动态对象的类型,这意味着您可以向Viewbag动态添加新字段,并在View中访问这些字段。创建新字段时,您需要初始化viewbag的对象。

例如:1.创建ViewBag:ViewBag.FirstName =“ John”;

  1. 访问视图:@ ViewBag.FirstName。