我遇到了这个错误,我想知道是否有人可以帮助解释为什么会发生这种情况。
我在视图中显示一系列书籍,一切都从模型中正确显示。但是,以下代码无效:
@foreach (var item in Model.Books)
{
.. (other unrelevant code is here)...
@{
<!-- Display icon based on the recommendation status -->
if (item.Recommendation.recName == "Highly Recommended" || item.Recommendation.recName == "Recommended")
{
<img src="~/Content/Images/check.png" alt="Recommended" title="This book is recommended."/>
}
if (item.Recommendation.recName == "Parental Judgement")
{
<img src="~/Content/Images/warning.png" alt="Parental Judgement" title="Parental Judgement required for this book."/>
}
if (item.Recommendation.recName == "NOT Recommended")
{
<img src="~/Content/Images/stop.png" alt="Not Recommended" title="This book is NOT Recommended!"/>
}
}
.. (other unrelevant code is here)...
}
从代码中应该很明显,但我要做的是根据每本书的推荐状态显示不同的图标。当我运行该代码时,它给出了一个错误Object reference not set to an instance of an object.
这是一个非常标准的错误类型,但我很困惑,因为对象引用似乎已设置,基于此代码正常工作并显示正确值(如Highly Recommended或不推荐)每本书:
@Html.DisplayFor(modelItem => item.Recommendation.recName)
总结一下我的具体问题:为什么modelItem => item...
中的lambda表达式工作,而同一模型的其他代码不起作用?
由于我在这里明显缺少对某些内容的理解,让我问一下更为一般的问题:何时使用@item.property
语法是“合法的”,何时会导致错误(就像我上面的那样)?
答案 0 :(得分:4)
根据您的描述,证据指向导致空引用异常的item.Recommendation
类型。它似乎(没有向我们提供更多信息)可能不初始化。这可以解释为什么@Html.DisplayFor()
正在运作。
您应该考虑首先检查它是否为null
。
if(item.Recommendation == null) throw new Exception(" Whoops! :) ");
或替代方案,您可以执行Safe Navigational / Null-conditional Operator
item.Recommendation?.recName // which does the work for you inline.
我不是在其他块中嵌套/组合使用@{ }
razor代码块的忠实粉丝。它可能很难阅读,通常很难调试。
@foreach ( ... )
{
@{
if( ... )
{
<html></html>
}
}
}
对战
@{ var foo = null; } // appropriate for declaring variables, and clean blocks of code.
@foreach ( ... )
{
@if( ... )
{
<html></html>
}
}