我想了解@ 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> }