C#Lambda表达式和@item语法

C#Lambda表达式和@item语法,c#,asp.net-mvc,lambda,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.r

我遇到了这个错误,我想知道是否有人可以帮助解释为什么会发生这种情况
我正在视图中显示一个书籍列表,所有内容都在模型中正确显示。但是,下面的代码不起作用:

@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)...
}
@foreach(Model.Books中的变量项)
{
..(其他不相关的代码在这里)。。。
@{
如果(item.Recommension.recName==“高度推荐”| | item.Recommension.recName==“推荐”)
{
}
如果(item.Recommension.recName==“家长判断”)
{
}
如果(item.Recommension.recName==“不推荐”)
{
}
}
..(其他不相关的代码在这里)。。。
}
从代码上看应该很明显,但我想做的是根据每本书的推荐状态显示一个不同的图标。当我运行该代码时,它会给我一个错误,即
对象引用未设置为对象的实例。


这是一种相当标准的错误类型,但我感到困惑,因为对象引用似乎是根据以下事实设置的:此代码正常工作,并为每本书显示正确的值(如高度推荐或不推荐):
@Html.DisplayFor(modelItem=>item.Recommendation.recName)


因此,总结一下我的具体问题:为什么
modelItem=>item…
中的lambda表达式工作,而同一精确模型的其他代码不工作?

由于我对这里的某些内容显然没有理解,让我问一个更一般的问题:何时使用
@item.property
语法是“合法的”,何时会导致错误(如我上面所述)?

空引用异常 根据您的描述,证据指向导致空引用异常的
项。建议
类型。似乎(没有向我们提供更多信息)它可能未初始化。这可能解释了
@Html.DisplayFor()
工作的原因

你应该首先检查它是否是代码> null 。< /P>

if(item.Recommendation == null) throw new Exception(" Whoops! :) ");
或者你也可以做一个


旁注 我不太喜欢在其他块中嵌套/组合使用
@{}
razor代码块。它可能很难阅读,而且调试起来也很头疼

@foreach ( ... )
{
    @{
        if( ... )
        {
            <html></html>
        }
    }
}
@foreach(…)
{
@{
如果(…)
{
}
}
}

@{ var foo = null; } // appropriate for declaring variables, and clean blocks of code.

@foreach ( ... )
{
    @if( ... )
    {
        <html></html>
    }
}
@{var foo=null;}//适用于声明变量和清除代码块。
@foreach(…)
{
@如果(…)
{
}
}
Null引用异常 根据您的描述,证据指向导致空引用异常的
项。建议
类型。似乎(没有向我们提供更多信息)它可能未初始化。这可能解释了
@Html.DisplayFor()
工作的原因

你应该首先检查它是否是代码> null 。< /P>

if(item.Recommendation == null) throw new Exception(" Whoops! :) ");
或者你也可以做一个


旁注 我不太喜欢在其他块中嵌套/组合使用
@{}
razor代码块。它可能很难阅读,而且调试起来也很头疼

@foreach ( ... )
{
    @{
        if( ... )
        {
            <html></html>
        }
    }
}
@foreach(…)
{
@{
如果(…)
{
}
}
}

@{ var foo = null; } // appropriate for declaring variables, and clean blocks of code.

@foreach ( ... )
{
    @if( ... )
    {
        <html></html>
    }
}
@{var foo=null;}//适用于声明变量和清除代码块。
@foreach(…)
{
@如果(…)
{
}
}

在哪里定义了
?你能展示一下代码吗?另外,lambda似乎是错误的,它期望
item=>item.recommedition.recName
。您确定
item.Recommendation.recName
存在吗?NRE意味着每个
项目
建议
部分都包含无法取消引用的空值(请参见此处的NRE解释:)。@juharr I添加在foreach循环的开头。为什么要标记该问题?和@TetsuyaYamamoto我理解什么是NRE,但是
@Html.DisplayFor(modelItem=>item.Recommendation.recName)
起作用。这是否意味着
建议
确实正确存在?我不知道控制器方法的外观,但通常
模型
会返回null,因为没有使用
返回视图(modelName)
传递强类型集合。请注意,
ViewBag.Model
是动态属性,如果模型集合未正确返回,则可能包含空值
Model.Books.Recommension
此时可能未初始化,在取消引用
recName
时抛出NRE。在哪里定义了
?你能展示一下代码吗?另外,lambda似乎是错误的,它期望
item=>item.recommedition.recName
。您确定
item.Recommendation.recName
存在吗?NRE意味着每个
项目
建议
部分都包含无法取消引用的空值(请参见此处的NRE解释:)。@juharr I添加在foreach循环的开头。为什么要标记该问题?和@TetsuyaYamamoto我理解什么是NRE,但是
@Html.DisplayFor(modelItem=>item.Recommendation.recName)
起作用。这是否意味着
建议
确实正确存在?我不知道控制器方法的外观,但通常
模型
会返回null,因为没有使用
返回视图(modelName)
传递强类型集合。请注意,
ViewBag.Model
是动态属性,如果模型集合未正确返回,则可能包含空值
Model.Books.Recommension
此时可能未初始化,并在取消引用
recName
时抛出NRE。该类型是字符串,因此无法解决问题。但我很欣赏这个建议,不要在剃须刀座上筑巢。你刚才说的话让我很惊讶