C#Lambda表达式和@item语法

时间:2017-05-30 02:02:06

标签: c# asp.net-mvc lambda

我遇到了这个错误,我想知道是否有人可以帮助解释为什么会发生这种情况。
我在视图中显示一系列书籍,一切都从模型中正确显示。但是,以下代码无效:

@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语法是“合法的”,何时会导致错误(就像我上面的那样)?

1 个答案:

答案 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>
    }
}