为什么MVC在看起来没有空引用时会抛出NullReferenceException?

4

我有一个MVC视图,在以下代码中抛出了NullReferenceException异常:

<div class="center-block text-center mb15">
    Showing @count of @Model.TotalItemCount results
</div>

因此,我预计错误是Model为空。但是,代码已经通过了同一视图中早期出现的以下代码:
@{
    long count = Model.Count();
}

通过代码调试可以看出,count 在这种情况下是6,Model.TotalItemCount 也是6,因此没有空引用。

但仍然抛出异常!

以下是奇怪的部分,对我来说毫无意义,也是问题的关键。当抛出异常时,在 Visual Studio 中会得到以下提示:

enter image description here

这似乎表明调试的视图与编辑器中显示的视图不同,但是:

  • 我已删除 binobj 文件夹并重新构建了应用程序,但未发现任何变化,并且
  • 该视图几个月内未更改,并且与其他控制器操作一起使用(是一个共享视图)。

在此行之前通过调试查看视图时,每一行都被正确地突出显示(所有文本都有黄色条)。


显示 @Model.Count() / @Model.TotalItemCount 的结果是否也会抛出错误? - Dylan
2
TotalItemCount是自动属性吗?还是它有一个实现?Count的实现是什么?我猜它只是IEnumerable.Count(),但我想确认一下。 - user47589
1
还有一件事,我之前注意到调试器有时会错误地识别抛出实际错误的Razor文件中的行。您能否与我们分享整个视图,并剪裁掉无关的HTML代码? - user47589
我注意到你在if语句中检查的是Model.Count而不是Model.Count(),所以不确定视图如何编译! - Mark PM
Model 是 Troy Goode 的 IPagedList<T> 的一个实例,它实现了一个 Count 属性,并继承自 IEnumerable<T> - Darren Oster
1个回答

6
答案是要放宽视野。虽然错误在Visual Studio中标记,异常指示它是由所指定的行号抛出的,但实际上异常实际上是由后面约5行(中间所有行都是HTML)的空引用引起的,在那里访问了一个值为空的属性。
不幸的是,Razor视图调试在这么长时间后仍没有达到应有的成熟度。感谢所有发表评论的人提供的意见。

2
通常这意味着有过期的文件被使用,通常重新启动IIS Express和/或VS和/或清理解决方案会有所帮助。否则调试Razor视图也可以正常工作。 - GSerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接