【问题标题】:Lambda expressions vs object references in MVC viewLambda 表达式与 MVC 视图中的对象引用
【发布时间】:2015-12-29 04:14:53
【问题描述】:

在强类型视图中使用 lambda 表达式和直接对象引用之间的有效区别是什么?显然,lambda 表达式要长得多,但它们似乎也有一些我还没有掌握的魔力。

这是一个例子... 在这种情况下,两个 item.Title 行都打印帖子的标题。你可以想象为什么我更喜欢较短的...

@foreach (var item in Model.Posts)
{
   @item.Title
   @Html.DisplayFor(modelItem => item.Title)
}

但是,在这种情况下(访问对象引用的对象),只有 lambda 有效。第一行出现“未设置对象引用”错误。

@foreach (var item in Model.Posts)
{
   @item.User.UserName
   @Html.DisplayFor(modelItem => item.User.UserName)
}

如果有人能为新手开发人员阐明这里发生了什么,我当然会学到一些东西。

【问题讨论】:

    标签: c# asp.net-mvc lambda


    【解决方案1】:

    请参阅DisplayFor method documentation 的备注部分。它说:

    此方法通常用于显示来自Model 属性公开的对象的值。有关此方法与其他 Display 方法之间差异的更多信息,请参阅 DisplayExtensions 类概述。 此方法根据正在呈现的属性的数据类型以及该属性是否使用某些属性进行标记,生成不同的 HTML 标记。该方法根据以下规则呈现标记:

    • 如果属性被键入为原始类型(整数、字符串等),则该方法会呈现一个表示属性值的字符串。

    • 如果属性类型是布尔值,则该方法为复选框呈现 HTML 输入元素。例如,名为 Enabled 的布尔属性可能会呈现如下标记: <input class="check-box" disabled="disabled" type="checkbox" checked="checked" />

    • 如果使用数据类型属性注释属性,则该属性指定为属性生成的标记。例如,如果该属性被标记为 EmailAddress 属性,则该方法会生成包含使用 ma​​ilto 协议配置的 HTML 锚点的标记,如下例所示: <a href='mailto:joe@contoso.com'>joe@contoso.com</a>

    • 如果对象包含多个属性,则该方法会为每个属性生成一个字符串,该字符串由属性名称的标记和属性值的标记组成。

    另一方面,不使用 DisplayFor 方法,不执行上述任何操作,它只是按原样显示值。 (注:@Razor 语法隐式执行 HTML 编码,所以前一句在形式上并不是 100% 正确)

    如果您想更好地了解 Lambda 在 DisplayFor 表达式中的作用,您可能会发现 this answer 很有用。

    【讨论】:

    • 谢谢@zespri!这个答案有助于澄清“有什么区别?”和“我为什么要使用它?”问题,而您的链接答案有助于我更好地掌握 MVC 中整个 Lambda 系统的内部工作原理。你真是太棒了!除非有人提出更好的建议,否则我可能会给你绿支票...
    猜你喜欢
    • 2019-01-20
    • 2010-12-10
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多