2015-12-29 25 views
0

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

下面是一个例子... 在这种情况下,无论是item.Title行打印文章的标题。你可以想象为什么我更喜欢更短的一个......但是,在这种情况下(访问对象所引用的对象),只有lambda工作。第一行出现“对象引用未设置”错误。

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

如果任何人都可以照亮新手开发者的情况,我肯定会学到一些东西。

回答

1

DisplayFor method documentation注释部分。它说:

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

  • 如果属性的类型是原语类型(整数,字符串等),该方法呈现的是表示属性值的字符串。
  • 如果属性类型为布尔型,则该方法为复选框呈现HTML输入元素。例如,名为Enabled的布尔属性可能会显示如下标记: <input class="check-box" disabled="disabled" type="checkbox" checked="checked" />
  • 如果使用数据类型属性对属性进行了注释,则该属性将指定为该属性生成的标记。例如,如果属性被标记为与EmailAddress属性,该方法生成包含经配置以与所述的mailto协议HTML锚标记,如在下面的例子: <a href='mailto:[email protected]'>[email protected]</a>

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

不使用在另一方面DisplayFor方法,不执行任何上述的,它只是显示值原样。 (注:@剃刀语法隐含地执行HTML编码,所以前一句是没有正式100%正确的)

如果你想了解一个更好一点的lambda在DisplayFor表达中的作用,你可能会发现this answer有用。

+0

谢谢@zespri!这个答案有助于澄清“有什么不同?”和“我为什么要使用它?”问题,而你的相关答案有助于我更好地理解MVC中整个Lambda系统的内部运作。你真棒!我可能会给你绿色的检查,除非有人更好地配合... – Methodician