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