我在C#和MVC相当新的和已经使用在某些时候,如匿名方法和lambda表达式LINQ。
通常我看到这个样子lambda表达式:
(x => x.Name), (x => { Console.WriteLine(x))
据我所知,波长=“变为”。 我从来没有见过,在不使用左参数lambda表达式。
我不知道如何将这种lambda表达式虽然翻译
@Html.DisplayFor(modelItem => item.FirstName)
任何人都可以提供一些线索就这一个我吗? 如果不是这是
(modelItem => modelItem.FirstName)?
我从微软得到这个介绍ASP.NET MVC的教程 。
lambda表达式是写一个匿名功能的一种方式,即一个函数没有名字。 你对“箭”的左侧有什么函数的参数,你必须在右侧哪些函数体。 因此, (x => x.Name)
逻辑转换成类似string Function(Data x) { return x.Name }
类型string
和Data
将明显变化,并且可以从上下文中得到。
不存在左侧参数转换成一个功能不带参数,以使本(() => someVariable)
逻辑转换为这样: string Function() { return someVariable; }
string Function() { return someVariable; }
在这一点上,你可能会开始怀疑,其中someVariable
来自,它不是一个函数参数,它是不是在功能定义。 你会是正确的,这样的功能就不会编译。 然而这样lambda函数是完全没有问题的,因为它允许外范围变量被提升和使用这种方式。 (内部包装类被创建,其中被在lambda表达式成为领域中使用的变量。)
现在,让我们看看model => item.FirstName
手段。 按道理它会转换成string Function(Model model) { return item.FirstName; }
string Function(Model model) { return item.FirstName; }
。 基本上,这是带有参数的功能,但不使用此参数。
而现在,信息的最后一位。 虽然lambda表达式表示在端的功能,有时它们不与实际被执行的目的而创建(虽然可能他们可以)。 lambda表达式可以在表达式树的形式来表示。 这意味着,而不是执行它,它可以被解析 。
在这个特定的情况下,MVC发动机不运行 lambda表达式表示的功能。 相反,表达分析 ,这样MVC引擎知道HTML为:发射这一行。 如果您的数据项目不从你的模型对象直接上门,lambda表达式的左侧部分没有关系。
我认为这是对foreach循环。 例:
@foreach(var item in model)
{
<td>
@html.displayfor(model => item.firstName) </td>
</td>
}
var item
需要被使用,因为该序列中的每个项目是一个匿名类型。 model => item.firstName
装置(input parameter) => expression
。 因为我们店目前的“项目”,在不能使用输入参数item
。
它使用一个参数的黏巴达。 看到这个问题
基本上DisplayFor不使用lambda函数参数模型(也可能是什么,我会说使用_或()),只是使用中的lambda函数用于循环使用displayfor反对。 DisplayFor需要一个lambda函数。
我也挣扎了很多,了解由Visual Studio生成的代码。 相反,提供有关lambda表达式的一般解释,我希望把使用ASP.NET MVC框架的上下文。
假设我们准备了Model类(例如目的地)具有两个属性:城市和ProvinceCode。
public class Destination
{
public string City { get; set; }
public string ProvinceCode { get; set; }
}
生成控制器和视图之后,我们应该通过Visual Studio中得到生成的代码为提及。 然而,所产生的代码是有点难以理解,尤其是对数据行
@Html.DisplayFor(modelItem => item.City)
我只是猜测 ,MVC团队应该认为HTML辅助类应在CSHTML文件中统一使用。 因此,他们试图用技巧来通过C#编译器。 在这种情况下,modelItem甚至没有用作该lambda表达式的输入参数。 我们不能用()作为类型是不正确的。 这就是为什么,如果我们更换模型或任何模型对象,lambda表达式的作品。
坦率地说,我想重写在一个更可读的形式所产生的代码。 相反,使用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>
}
文章来源: I want to understand the lambda expression in @Html.DisplayFor(modelItem => item.FirstName)