在调试View时遇到了一个有趣的效果.该场景很容易重现 – 我在View中有一个断点,在Watch窗口中我添加了ViewBag.ViewData,值为null.但是,如果我只是添加ViewBag并展开对象,我可以看到ViewData并且它不是null.我也可以成功扩展它并查看其属性.
谁能解释这是一个错误还是导致这种行为的原因?
编辑
ViewBag.ViewData实际上是null.例如.如果我在视图中有这个代码:
if (ViewBag.ViewData == null) { <span>ViewBag.ViewData is null</span> }
它显示跨度.所以奇怪的是我可以在观察窗口中展开它并查看属性.
EDIT2
为了回应@Darin Dimitrov的回答 – 我尝试使用自定义测试类重现此行为,并且在尝试访问私有属性时遇到RuntimeBinderException:’SomeClass.SomeProperty’由于其保护级别而无法访问:
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))?
解决方法
您在调试器/监视窗口中看到的是ViewBag的私有ViewData属性.当您在视图中进行测试时,您显然无权访问此私有字段,并且您将获得null,因为没有相应的公共属性.
现在在视图中执行以下测试:
@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应用程序开发中最糟糕的敌人.
结论:始终使用视图模型和强类型视图并获得乐趣.