c# – 我的ViewData如何为null,但在调试器中是否可扩展?

前端之家收集整理的这篇文章主要介绍了c# – 我的ViewData如何为null,但在调试器中是否可扩展?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在调试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应用程序开发中最糟糕的敌人.

结论:始终使用视图模型和强类型视图并获得乐趣.

猜你在找的C#相关文章