我想了解@ Html.DisplayFor(modelItem => item.FirstName)中的lambdaexpression式

我是相当新的C#和MVC,并已在某些场合使用lambdas,如匿名方法和LINQ。

通常我会看到类似这样的lambdaexpression式:

(x => x.Name), (x => { Console.WriteLine(x)) 

我明白,lambda =“去”。 我从来没有见过一个lambdaexpression式的左侧参数不使用。

我不知道如何翻译这个lambdaexpression式

 @Html.DisplayFor(modelItem => item.FirstName) 

任何人都可以为我介绍一下这一点吗? 不应该这样

 (modelItem => modelItem.FirstName)? 

我从微软的ASP.NET MVC入门教程中得到了这个。

lambdaexpression式是一种编写匿名函数的方法,即没有名字的函数。 “箭头”左侧的是函数参数,右侧是函数体。 因此, (x => x.Name)逻辑上转化为类似于string Function(Data x) { return x.Name }types的string并且Data将明显改变,并从上下文派生。

缺less左侧参数可以转化为一个没有参数的函数,这样(() => someVariable)逻辑上转换为: string Function() { return someVariable; } string Function() { return someVariable; }

在这一点上,你可能会开始想知道, someVariable来自哪里,这不是一个函数参数,它没有在函数中定义。 你会是正确的,这样的function将永远不会编译。 然而像这样的lambda函数是非常好的,因为它允许外部variables被取消并以这种方式使用。 (在内部创build一个包装类,其中在lambdaexpression式中使用的variables变成了字段。)

现在让我们来看看model => item.FirstName意思。 从逻辑上讲,它将转换为string Function(Model model) { return item.FirstName; } string Function(Model model) { return item.FirstName; } 。 基本上这是一个带参数的函数,但是这个参数没有被使用。

而现在,信息的最后一点。 尽pipelambdaexpression式最终表示函数,但有时它们并不是为了实际执行目的而创build的(尽pipe潜在地他们可以)。 lambdaexpression式可以用expression式树的forms表示。 这意味着,而不是执行它可以parsing

在这种特殊情况下,MVC引擎不会运行 lambdaexpression式所表示的函数。 相反,expression式被parsing,以便MVC引擎知道这个特定的行要发送什么样的html。 如果你的数据项不是直接来自你的模型对象,lambdaexpression式的左边部分并不重要。

我认为这是关于foreach循环。 例:

 @foreach(var item in model) { <td> @html.displayfor(model => item.firstName) </td> </td> } 

var item需要被使用,因为序列中的每个项目都是匿名types。 model => item.firstName表示(input parameter) => expression 。 您不能使用input参数,因为我们在item存储了当前的“项目”。

它使用无参数的lambda。 看到这个问题

基本上DisplayFor不使用lambda函数参数模型(它可以是任何我会说使用_或()),只是使用for循环内的lambda函数来使用displayfor对此。 DisplayFor需要一个lambda函数。

我也努力了解Visual Studio生成的代码。 我不想提供关于lambdaexpression式的一般性解释,而是想使用ASP.NET MVC框架来放置一个上下文。

假设我们准备了具有2个属性的Model类(例如Destination):City和ProvinceCode。

 public class Destination { public string City { get; set; } public string ProvinceCode { get; set; } } 

在生成Controller和View之后,我们应该如上所述通过Visual Studio获取生成的代码。 然而,生成的代码有点难以理解,特别是对于数据行

 @Html.DisplayFor(modelItem => item.City) 

我只是猜测 MVC团队应该认为Html辅助类应该一直用在cshtml文件中。 因此,他们试图使用技巧来传递C#编译器。 在这种情况下,modelItem甚至不被用作此lambdaexpression式的input参数。 我们不能使用(),因为types正确。 这就是为什么,如果我们replace模型或任何模型对象,lambdaexpression式的作品。

说实话,我想用更可读的forms重写生成的代码。 我们可以不使用Html帮助器类,而是像下面这样简单地输出正确的输出:

 @foreach (var item in Model) { <tr> <td> @* Code Generated by Visual Studio. modelItem is a dummy param *@ @Html.DisplayFor(modelItem => item.City) </td> <td> @* A better way - simply get rid of Html helper class *@ @item.ProvinceCode </td> </tr> }