为什么 ViewBag.SomeProperty 在属性不存在时不会引发异常

本文关键字:异常 不存在 ViewBag SomeProperty 属性 为什么 | 更新日期: 2023-09-27 17:56:17

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时,它不会发生.有什么区别

为什么 ViewBag.SomeProperty 在属性不存在时不会引发异常

AFAIK ViewBag是围绕ViewData的动态包装器。ViewData本身按如下方式检索值:

public object this[string key]
{
    get
    {
        object value;
        _innerDictionary.TryGetValue(key, out value);
        return value;
    }
    set { _innerDictionary[key] = value; }
}

因此,如果 key 不存在,它将返回 type 的默认值,并且不会引发异常。

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