@Html.DisplayNameFor() 中的 Lambda 表达式

Posted

技术标签:

【中文标题】@Html.DisplayNameFor() 中的 Lambda 表达式【英文标题】:Lambda expression in @Html.DisplayNameFor() 【发布时间】:2015-11-13 06:33:24 【问题描述】:

假设我将 ListPerson 作为模型传递给视图页面:

@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 =&gt; item.Id) 在所示范围内使用时忽略参数。不使用它,类似这样的东西

public int Id = 5;
public string DisplayFor(Person ListOfPersons)

    return Id;

所以从这方面可以看出,没有使用参数,返回的值其实是不同作用域的值。

DisplayFor 的作用域是使用要绑定到的页面模型。所以不管参数名称是什么,传入参数的都是模型。因此,由于该参数在此处被完全忽略,因此它的名称并不特别重要,可以简单地为 ()_

然后返回值是来自正文的值,在本例中为 item.Iditem.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)

视图引擎将检查表达式并确定您想要为IdName 属性“显示”控件。它忽略“输入”变量名(在这种情况下为ListOfPersons*)和item 变量,只解析右侧的表达式。你也可以这样做:

@Html.DisplayFor(_ => item.Id) : @Html.DisplayFor(_ => item.Name)

*请注意,您的 lambda 中的 ListOfPersons 不会引用局部变量 - 它只是创建一个您可以在 lambda 中引用的 new “变量”。您似乎有一个名为 ListOfPersons 的属性或局部变量这一事实无关紧要。

【讨论】:

以上是关于@Html.DisplayNameFor() 中的 Lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

MVC 5 视图中的@model 和 Model 是啥

ASP.NET MVC Bootstrap 动态模态内容

iOS Xcode 中的 UIViewController 中的 UIView 中的 UITableView

如何用ruby中的数组中的元素替换字符串中的单词?

如何将视图中的 javascript 代码中的对象列表传递给控制器​​中的操作方法

如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B 中的 AWS Lambda 函数(VPC 中的这个 Lambda)