在调试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应用程序时,ViewDataViewBag都没有位置。在ASP.NET MVC应用程序开发中,这两个是我最大的敌人。

结论:始终使用 View 模型和强类型 View 并从中获得乐趣。

关于c# - 我的ViewData如何为null,但可以在调试器中扩展?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5818331/

10-13 04:32