2013-01-09 29 views
0

我发现这个Related Topic,但它没能回答我的问题。这个lambda表达式为什么起作用?

时自动创建一个强类型的视图,让有List脚手架模板说,我要得到的东西大体是这样:

@model IEnumerable<Test.Models.abc> 
<table> 
    <tr> 
    <th> 
     @Html.DisplayNameFor(model => model.ID) 
    </th> 
</tr> 

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.ID) 
    </td> 
</tr> 
} 
</table> 

我明白@Html.DisplayNameFor(model => model.ID)完全,但不@Html.DisplayFor(modelItem => item.ID)

modelItem的用途是什么?用任意文本替换它将导致功能性网页。看起来,modelItem只是一个一扔的词。我想我真正的问题是为什么不工作?

@Html.DisplayFor(item => item.ID) 

编辑

好点的被带到了意见。看来你也能够改变model任何东西,只要你改变它的lambda表达式的两边:

@Html.DisplayNameFor(abc => abc.ID) 

A面的问题是:如何在顶部的@model声明影响下面的功能?我以前认为model引用了@model表达式,以便通过该类找出显示名称,但该页面在提及的更改之后仍然有效。

+1

为什么你理解第一个而不是第二个?你也可以用任何单词替换'model'。 – GSerg

+0

在这种情况下,您需要将'model'的两个实例更改为相同的东西。所以我想我完全不了解它。我的印象是'model'引用了第一行,告诉它要使用哪个类/模型。谨慎解释? – Jeff

+1

不,模型意味着什么,因为C#区分大小写,实际模型是“模型”。在你的第一个lambda中,返回值取决于lambda参数。 (编译器知道这个参数是你的'Model'类型的,你实际上并没有传递你的'Model',你传递了指令 - Model的property属性。)这就是为什么它必须是相同的变量名左和右。在你的第二个lambda中,你想要的结果不依赖于lambda参数,但是你仍然需要传递一个参数。这就是为什么它的名字不重要,它只是被丢弃。 – GSerg

回答

1

它不起作用,因为item已在foreach的外部范围内声明。

@foreach (var item in Model)

modelItem lambda未使用的原因是因为该迭代IEnumerable。如果将Test.Models.abc作为模型而不是IEnumerable,那么该lambda是否有用并且DisplayFor的代码将更改为@Html.DisplayFor(m => m.ItemId)

更新

@model IEnumerable<Test.Models.abc>只是声明,这种看法是强类型的,有型的IEnumerable<Test.Models.abc> - 你的情况。这意味着视图属性this.Model(不是model)的类型为IEnumerable<Test.Models.abc> - 并且该类型的该模型应传递到此视图中。上例中的model只是表达式变量 - 它仅适用于该表达式。您可以将其名称更改为任何未在外部作用域中使用的未受保护的合法变量名称(这就是为什么它不应被命名为Model,因为它会隐藏已在视图中声明的Model属性)。

0

item已经是在外部范围内定义的变量。你将它捕获为闭包,这在这里并不理想。你的代码应该是:

@Html.DisplayFor(modelItem => modelItem.ID) 
+0

你确定这可行吗? 'modelItem'这里是一个'IEnumerable',它肯定没有属性ID。这也是为什么在'foreach'迭代中使用变量'item'的原因。 – mipe34

+0

这实际上不起作用。我提供的代码是工作代码 – Jeff

+0

这里的'IEnumerable'是'Model'。 'modelItem'只在lambda中定义,所以这个解决方案应该像其他任何解决方案一样工作(它与'@ Html.DisplayFor(m => m.ItemId)'''接受的解决方案相同)。 – jam40jeff

相关问题