【问题标题】:C# Lambda expressions and @item syntaxC# Lambda 表达式和@item 语法
【发布时间】:2017-05-30 02:02:06
【问题描述】:

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

@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.

这是一个非常标准的错误类型,但我很困惑,因为对象引用似乎已设置,基于 此代码 正常工作并显示正确值(例如强烈推荐或不推荐)每本书:
@Html.DisplayFor(modelItem =&gt; item.Recommendation.recName)

所以总结一下我的具体问题:为什么modelItem =&gt; item... 中的 lambda 表达式有效,而 same exact model 的其他代码无效?

而且由于我显然在这里缺少对某些东西的理解,所以让我问一个更一般的问题:什么时候使用@item.property 语法是“合法的”,什么时候会导致错误(比如我有以上)?

【问题讨论】:

  • item 在哪里定义?你能显示那个代码吗?而且那个 lambda 似乎是错误的,它应该是 item = &gt; item.Recommedation.recName。
  • 您确定item.Recommendation.recName 存在吗? NRE 表示每个item 或Recommendation 部分都包含无法取消引用的空值(请参阅此处的NRE 说明:stackoverflow.com/questions/4660142/…)。
  • @juharr 我在 foreach 循环的开头添加了。
  • 为什么问题被标记了? @TetsuyaYamamoto 我了解 NRE 是什么,但 @Html.DisplayFor(modelItem =&gt; item.Recommendation.recName) 有效。这不是说item 或Recommendation 都确实存在吗?
  • 我不知道控制器方法长什么样,但由于没有使用return View(modelName) 传递强类型集合,Model 通常会返回 null。请注意,ViewBag.Model 是动态属性,如果模型集合未正确返回,则可能包含空值。 Model.Books.Recommendation 此时可能未初始化并在取消引用 recName 时抛出 NRE。

标签: c# asp.net-mvc lambda


【解决方案1】:

空引用异常

根据您的描述,证据指向您的 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>
    }
}

【讨论】:

  • 类型是字符串,所以没有解决问题。但我很欣赏关于不嵌套剃刀块的提示。现在你说的更有意义,因为它是用一个例子写出来的。
  • 是的,成功了!我有一个哎呀 :( 但至少我知道从现在开始在哪里工作。谢谢你 Svek
猜你喜欢
  • 2011-07-12
  • 2013-05-31
  • 2010-12-05
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2010-09-25
  • 2011-07-04
  • 2021-07-09
相关资源
最近更新 更多