在强类型视图中使用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)
}
如果有人可以说明新手开发人员在这里发生了什么,我当然可以学到一些东西。
答案 0 :(得分:1)
请参阅DisplayFor method documentation的备注部分。它说:
此方法通常用于显示Model属性公开的对象的值。有关此方法与其他Display方法之间差异的详细信息,请参阅DisplayExtensions类概述。 此方法根据正在呈现的属性的数据类型以及是否使用某些属性标记属性,生成不同的HTML标记。该方法根据以下规则呈现标记:
- 如果属性被键入为基本类型(整数,字符串等),则该方法将呈现表示属性值的字符串。
- 如果属性类型为Boolean,则该方法为复选框呈现HTML输入元素。例如,名为Enabled的布尔属性可能会呈现如下标记:
<input class="check-box" disabled="disabled" type="checkbox" checked="checked" />
如果使用数据类型属性注释属性,则该属性指定为该属性生成的标记。例如,如果属性标有EmailAddress属性,则该方法会生成包含使用 mailto 协议配置的HTML锚点的标记,如下例所示:
<a href='mailto:joe@contoso.com'>joe@contoso.com</a>
如果对象包含多个属性,则对于每个属性,该方法都会生成一个字符串,该字符串包含属性名称的标记和属性值的标记。
另一方面,不使用DisplayFor方法,不做上述任何操作,它只是按原样显示值。 (注意:@
Razor语法隐式执行HTML编码,因此上一句话不正式100%正确)
如果您想更好地了解Lambda在DisplayFor表达式中的作用,您可能会发现this answer很有用。