我想了解在@ Html.DisplayFor lambda表达式(modelItem => i

2019-05-13 12:06发布

我在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的教程 。

Answer 1:

lambda表达式是写一个匿名功能的一种方式,即一个函数没有名字。 你对“箭”的左侧有什么函数的参数,你必须在右侧哪些函数体。 因此, (x => x.Name)逻辑转换成类似string Function(Data x) { return x.Name }类型stringData将明显变化,并且可以从上下文中得到。

不存在左侧参数转换成一个功能不带参数,以使本(() => 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表达式的左侧部分没有关系。



Answer 2:

我认为这是对foreach循环。 例:

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

var item需要被使用,因为该序列中的每个项目是一个匿名类型。 model => item.firstName装置(input parameter) => expression 。 因为我们店目前的“项目”,在不能使用输入参数item



Answer 3:

它使用一个参数的黏巴达。 看到这个问题

基本上DisplayFor不使用lambda函数参数模型(也可能是什么,我会说使用_或()),只是使用中的lambda函数用于循环使用displayfor反对。 DisplayFor需要一个lambda函数。



Answer 4:

我也挣扎了很多,了解由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)