@Html.DisplayNameFor() 中的 Lambda 表达式
Posted
技术标签:
【中文标题】@Html.DisplayNameFor() 中的 Lambda 表达式【英文标题】:Lambda expression in @Html.DisplayNameFor() 【发布时间】:2015-11-13 06:33:24 【问题描述】:假设我将 List
或 Person
作为模型传递给视图页面:
@model IEnumerable<Foo.Models.Person>
@foreach (var item in Model)
<p>
@html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name)
</p>
我只是不明白这个 Lambda 表达式是如何工作的。为什么我们要传递 IEnumerable
并在其对象上获取单个值?
【问题讨论】:
这个问题或许能帮到你***.com/questions/6365633/… 【参考方案1】:由于ListOfPersons
不是声明变量,只是表达式的参数名,所以表达式有效。
简单说一下表达式,它们由参数集和主体组成。
(parameter set) => (body)
参数集可以为空()
或包含1 个或多个参数(x)
或(x,y)
。然后主体可以使用这些参数,类似于方法主体使用传入参数的方式。
@Html.DisplayFor(ListOfPersons => item.Id)
在所示范围内使用时忽略参数。不使用它,类似这样的东西
public int Id = 5;
public string DisplayFor(Person ListOfPersons)
return Id;
所以从这方面可以看出,没有使用参数,返回的值其实是不同作用域的值。
DisplayFor 的作用域是使用要绑定到的页面模型。所以不管参数名称是什么,传入参数的都是模型。因此,由于该参数在此处被完全忽略,因此它的名称并不特别重要,可以简单地为 ()
或 _
。
然后返回值是来自正文的值,在本例中为 item.Id
和 item.Name
。但是,由于没有使用该参数,即使显示的值看起来是准确的,渲染的 html 也会不正确。
为了解决这个问题,必须正确访问模型,否则渲染的 html 将不会绑定在 post 上。这通常通过迭代和使用索引引用来完成,如@Jonespolis' answer 所示。
【讨论】:
感谢您的完整回答。我只是很困惑为什么它会得到一个不会使用的论点【参考方案2】:在 razor 中使用 for 循环,以便保持对模型的直接引用:
@for(int i =0; i < Model.Count(); i++)
<p>
@Html.DisplayFor(model => model[i].Id) : @Html.DisplayFor(model => model[i].Name)
</p>
【讨论】:
【参考方案3】:@Html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name)
视图引擎将检查表达式并确定您想要为Id
和Name
属性“显示”控件。它忽略“输入”变量名(在这种情况下为ListOfPersons
*)和item
变量,只解析右侧的表达式。你也可以这样做:
@Html.DisplayFor(_ => item.Id) : @Html.DisplayFor(_ => item.Name)
*请注意,您的 lambda 中的 ListOfPersons
不会引用局部变量 - 它只是创建一个您可以在 lambda 中引用的 new “变量”。您似乎有一个名为 ListOfPersons
的属性或局部变量这一事实无关紧要。
【讨论】:
以上是关于@Html.DisplayNameFor() 中的 Lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章
iOS Xcode 中的 UIViewController 中的 UIView 中的 UITableView
如何将视图中的 javascript 代码中的对象列表传递给控制器中的操作方法
如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B 中的 AWS Lambda 函数(VPC 中的这个 Lambda)