MVC视图中Lambda表达式与对象引用
本文关键字:对象引用 表达式 Lambda 视图 MVC | 更新日期: 2023-09-27 18:28:29
在强类型视图中使用lambda表达式和直接对象引用之间的有效区别是什么?显然,lambda表达式要长得多,但它们似乎也有一些我还没有掌握的魔力。
下面是一个例子。。。在这种情况下,两个项目。标题行打印文章的标题。你可以想象我为什么喜欢短一点的。。。
@foreach (var item in Model.Posts)
{
@item.Title
@Html.DisplayFor(modelItem => item.Title)
}
但是,在这种情况下(访问对象引用的对象),只有lambda有效。第一行出现"Object reference not set"错误。
@foreach (var item in Model.Posts)
{
@item.User.UserName
@Html.DisplayFor(modelItem => item.User.UserName)
}
如果有人能为一个新手开发人员阐明这里发生了什么,我肯定会学到一些东西。
请参阅DisplayFor方法文档的备注部分。上面写着:
此方法通常用于显示由Model属性公开的对象的值。有关此方法与其他Display方法之间差异的更多信息,请参阅DisplayExtensions类概述。此方法根据正在呈现的属性的数据类型以及该属性是否标记有某些属性来生成不同的HTML标记。该方法根据以下规则呈现标记:
如果属性被类型化为基元类型(整数、字符串等),则该方法将呈现表示属性值的字符串。
如果属性类型为Boolean,则该方法会为复选框呈现HTML输入元素。例如,名为Enabled的布尔属性可能会呈现以下标记:
<input class="check-box" disabled="disabled" type="checkbox" checked="checked" />
如果使用数据类型属性对属性进行注释,则该属性将指定为该属性生成的标记。例如,如果该属性用EmailAddress属性标记,则该方法会生成包含HTML锚的标记,该锚使用mailto协议配置,如下例所示:
<a href='mailto:joe@contoso.com'>joe@contoso.com</a>
如果对象包含多个属性,则该方法会为每个属性生成一个字符串,该字符串由属性名称的标记和属性值的标记组成。
另一方面,不使用DisplayFor方法,不执行上述任何操作,它只是按原样显示值。(注意:@
Razor语法隐式执行HTML编码,因此前一句在形式上不是100%正确的)
如果你想更好地理解Lambda在DisplayFor表达式中的作用,你可能会发现这个答案很有用。