在调试View时遇到了一个有趣的效果。该方案很容易重现-我在View
中有一个断点,在“监视”窗口中添加ViewBag.ViewData
,其值为null
。但是,如果仅添加ViewBag
并展开对象,则可以看到ViewData
,而它不是null
。我也可以成功地扩展它并查看其属性。
谁能解释这是一个错误还是导致此现象的原因?
编辑ViewBag.ViewData
实际上是null
。例如。如果我在 View 中有此代码:
if (ViewBag.ViewData == null)
{
<span>ViewBag.ViewData is null</span>
}
它显示跨度。因此,很奇怪的部分是我可以在监视窗口中将其展开并查看属性。
EDIT2
响应@Darin Dimitrov的回答-我尝试使用自定义测试类重现此行为,并且尝试访问私有(private)属性时收到
RuntimeBinderException
:'SomeClass.SomeProperty' is inaccessible due to its protection level
:public class SomeClass
{
private string SomeProperty;
}
dynamic dynamicObject = new SomeClass();
if (dynamicObject.SomeProperty == null)
{
Console.WriteLine("dynamicObject.SomeProperty is null");
}
在这种情况下,在 View 中访问
ViewBag.ViewData
(带有if (ViewBag.ViewData == null)
的行)时,我是否应该得到相同的异常? 最佳答案
您在调试器/监视窗口中看到的是ViewData
的私有(private) ViewBag
属性。当您在 View 中进行测试时,您显然无权访问此私有(private)字段,并且由于没有相应的公共(public)属性,您将获得null。
现在在 View 中进行以下测试:
@if (null == ViewBag
.GetType()
.GetProperty("ViewData", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(ViewBag, null)
)
{
<span>ViewBag.ViewData is null</span>
}
而且您不会看到跨度。
当然,所有这些都非常有趣,但是当涉及到编写真实世界和适当架构的ASP.NET MVC应用程序时,
ViewData
和ViewBag
都没有位置。在ASP.NET MVC应用程序开发中,这两个是我最大的敌人。结论:始终使用 View 模型和强类型 View 并从中获得乐趣。
关于c# - 我的ViewData如何为null,但可以在调试器中扩展?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5818331/