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。该类型是字符串,因此无法解决问题。但我很欣赏这个建议,不要在剃须刀座上筑巢。你刚才说的话让我很惊讶