欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

我想了解@ Html.DisplayFor(modelItem => item.FirstName)中的lambda表达式 函数 方法 有大用

我是C#和MVC的新手,在某些场合使用过lambda,例如用于匿名方法和LINQ。

通常我会看到如下所示的lambda表达式:

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

我了解到lambda =“ goes to”。我从未见过不使用left参数的lambda表达式。

我不知道如何翻译这个lambda表达式

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

谁能为我阐明一下这一点?这不应该是

(modelItem => modelItem.FirstName)?
                   

我是从Microsoft的ASP.NET
MVC入门教程中获得的


阅读 324

               
 收藏
 2020-05-19

共1个答案

小编典典

                   

Lambda表达式是一种编写匿名函数(即不带名称的函数)的方法。在“箭头”左侧的内容是函数参数,而在右侧的内容是函数主体。因此,在(x => x.Name)逻辑上转换为类似string Function(Data x) { return x.Name }类型的东西,string并且Data显然会有所不同并从上下文派生。

缺少左侧参数将转换为不带参数的函数,因此(() => someVariable)从逻辑上可以转换为:string Function() { return someVariable; }                    

在这一点上,您可能会开始想知道someVariable它的来源,它不是函数参数,并且未在函数中定义。您将是对的,像这样的函数将永远无法编译。但是,这样的lambda函数非常好,因为它允许提升和使用外部范围变量。(内部创建一个包装器类,其中在lambda表达式中使用的变量将成为字段。)

现在,让我们看看这model => item.FirstName意味着什么。从逻辑上讲,它将转换为string Function(Model model) { return item.FirstName; }。基本上,这是带有参数的函数,但是不使用此参数。

现在,信息的最后一点。尽管lambda表达式最后表示函数,但有时创建它们并不是出于实际执行的目的(尽管可能这样做)。Lambda表达式可以以表达式树的形式表示。这意味着可以
解析 它而不是执行它。

在这种特殊情况下,MVC引擎不会 运行 lambda表达式表示的功能。取而代之的是 解析
表达式,以便MVC引擎知道要为此特定行发出的html。如果您的数据项不是直接来自模型对象,则lambda表达式的左侧部分无关紧要。

2020-05-19                    


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

需要使用var item,因为序列中的每个项目都是匿名类型。model => item.firstName表示(input parameter) => expression。您无法使用输入参数,因为我们将当前“项目”存储在item中。

varg answered 2020-06-25T20:26:05Z    
4 votes

它正在使用无参数lambada。 看到这个问题

基本上,DisplayFor不使用lambda函数参数模型(可以是_或()表示的任何东西),而只是在for循环中使用lambda函数对它使用displayfor。 DisplayFor需要一个lambda函数。

GraemeMiller answered 2020-06-25T20:26:30Z    
1 votes

为了理解Visual Studio生成的代码,我也付出了很多努力。 除了提供有关lambda表达式的一般说明外,我想使用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甚至都不用作此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>
}
   
Peter Chung answered 2020-06-25T20:27:08Z    


来自  https://codingdict.com/questions/24148


mvc html.displayfor,我想了解@ Html.DisplayFor(modelItem => item.FirstName)中的lambda表达式...




为了理解Visual Studio生成的代码,我也付出了很多努力。 除了提供有关lambda表达式的一般说明外,我想使用ASP.NET MVC框架作为上下文。

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

public class Destination

{undefined

public string City { get; set; }

public string ProvinceCode { get; set; }

}

生成Controller和View之后,我们应该如上所述通过Visual Studio获取生成的代码。 但是,生成的代码有些难以理解,尤其是对于数据行

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

我只是猜想MVC团队应该认为HTML助手类应该在cshtml文件中一致使用。 因此,他们试图使用技巧来传递C#编译器。 在这种情况下,modelItem甚至都不用作此lambda表达式的输入参数。 我们不能使用(),因为类型不正确。 这就是为什么,如果我们替换模型或任何模型对象,lambda表达式就会起作用。

老实说,我想以更易读的形式重写生成的代码。 代替使用Html帮助器类,我们可以简单地呈现正确的输出,如下所示:

@foreach (var item in Model) {undefined

@* Code Generated by Visual Studio. modelItem is a dummy param *@

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

@* A better way - simply get rid of Html helper class *@

@item.ProvinceCode

}


来自  https://blog.csdn.net/weixin_33502772/article/details/118121025




C# MVC4 中@Html.DisplayNameFor(model => model.Name)和@Html.DisplayFor(modelItem => item.Name)问题    

MVC4中自动生成的列表页中代码的意思

@model IEnumerable<MvcGuestbook.Models.GuestBook>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("新建", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Email)
</th>
<th>
@Html.DisplayNameFor(model => model.Content)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
@Html.DisplayFor(modelItem => item.Content)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>
这里面的@Html.DisplayNameFor(model => model.Name)和@Html.DisplayFor(modelItem => item.Name)为什么第一个方法的lambda表达式左边是参数model ,而第二个方法的 lambda表达式左边却是modelItem,这个modelItem是什么意思呢?
   
 我来答  举报
吴舍我
2014-05-11                
这个是lamda表达式,用model或modelItem都可以,只是一个变量名而已,都代表了当前的从Controller里传过来的model
追问
还有点疑问,你看@Html.DisplayNameFor(model => model.Name)中前面的那个model就不能改成别的,而下面foreach循环里的@Html.DisplayFor(modelItem => item.Name)中的modelItem 改成其他的就可以呢,这是为什么呢
                           

来自  https://zhidao.baidu.com/question/1445711837930608500.html


普通分类: