为什么当属性不存在时,ViewBag.SomeProperty不会抛出异常?

5
在MVC中,有时根据某些条件设置ViewBag的特定属性。例如:
if(someCondition)
{
   // do some work
   ViewBag.SomeProperty = values;
}

return View();

在我的View中,我像这样检查属性是否为空:
@if(ViewBag.SomeProperty != null)
{
   ...
}

直到现在我一直认为应该抛出一个异常,因为如果我的条件不满足,那么SomeProperty就永远不会被设置。这就是为什么我总是使用else语句将该属性设置为null。但是我刚刚注意到,即使属性不存在,它也不会抛出异常。例如,在Console Application中,如果我执行以下操作,我会得到RuntimeBinderException

dynamic dynamicVariable = new {Name = "Foo"};

if(dynamicVariable.Surname != null) Console.WriteLine(dynamicVariable.Surname);

但是当涉及到ViewBag时,这种情况并不会发生。那么这之间有什么区别呢?

2个回答

9
据我所知,ViewBagViewData的动态包装器。而ViewData本身则按以下方式检索值:
public object this[string key]
{
    get
    {
        object value;
        _innerDictionary.TryGetValue(key, out value);
        return value;
    }
    set { _innerDictionary[key] = value; }
}

因此,如果键不存在,则返回类型的默认值,并且不会抛出异常。

1
ViewBag继承自DynamicViewDataDictionary,对于缺失的属性返回null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接