Je veux comprendre l’expression lambda dans @ Html.DisplayFor (modelItem => item.FirstName)

Je suis assez nouveau chez C # et MVC et j’ai utilisé des lambdas à certaines occasions, comme pour les méthodes anonymes et sur LINQ.

En général, je vois des expressions lambda qui ressemblent à ceci:

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

Je comprends que lambda = “va à”. Je n’ai jamais vu une expression lambda où le paramètre de gauche n’est pas utilisé.

Je ne sais pas comment traduire cette expression lambda bien

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

Est-ce que quelqu’un peut nous éclairer sur celui-ci? Ne devrait-ce pas être

 (modelItem => modelItem.FirstName)? 

Je l’ai eu depuis le tutoriel Introduction à ASP.NET MVC de Microsoft.

Une expression lambda est un moyen d’écrire une fonction anonyme, c’est-à-dire une fonction sans nom. Ce que vous avez sur le côté gauche de la “flèche” sont les parameters de la fonction, et ce que vous avez sur le côté droit sont le corps de la fonction. Ainsi, (x => x.Name) traduit logiquement par quelque chose comme ssortingng Function(Data x) { return x.Name } les types ssortingng et Data varieront évidemment et seront dérivés du contexte.

L’absence du paramètre de gauche se traduit par une fonction sans parameters, de sorte que (() => someVariable) traduit logiquement par ceci: ssortingng Function() { return someVariable; } ssortingng Function() { return someVariable; }

À ce stade, vous pourriez commencer à vous demander d’où vient la someVariable , ce n’est pas un paramètre de fonction et ce n’est pas défini dans la fonction. Vous auriez raison, une fonction comme celle-ci ne comstackrait jamais. Cependant, la fonction lambda comme celle-ci est parfaitement correcte car elle permet de lever et d’utiliser les variables externes. (En interne, une classe wrapper est créée où les variables utilisées dans l’expression lambda deviennent des champs.)

Voyons maintenant quel model => item.FirstName signifie. Logiquement, cela se traduirait par une ssortingng Function(Model model) { return item.FirstName; } ssortingng Function(Model model) { return item.FirstName; } . Fondamentalement, il s’agit d’une fonction avec un paramètre, mais ce paramètre n’est pas utilisé.

Et maintenant, le dernier morceau de l’information. Bien que les expressions lambda représentent des fonctions à la fin, elles sont parfois créées dans le but de ne pas être réellement exécutées (bien qu’elles le puissent potentiellement). Une expression lambda peut être représentée sous la forme d’un arbre d’expression. Cela signifie qu’au lieu de l’exécuter, il peut être analysé .

Dans ce cas particulier, le moteur MVC n’exécute pas la fonction que représente l’expression lambda. Au lieu de cela, l’expression est analysée afin que le moteur MVC sache quel code HTML émettre pour cette ligne particulière. Si votre élément de données ne provient pas directement de votre object modèle, la partie gauche de l’expression lambda n’a pas d’importance.

Je pense que c’est à propos de la boucle foreach. Exemple:

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

var item doit être utilisé car chaque élément de la séquence est un type anonyme. model => item.firstName signifie (input parameter) => expression . vous ne pouvez pas utiliser le paramètre d’entrée car nous stockons l’élément actuel dans l’ item .

Il utilise un lambada sans paramètre. Voir cette question

Fondamentalement, DisplayFor n’utilise pas le modèle de paramètre de la fonction lambda (cela pourrait être tout ce que je dirais, utilisez _ ou ()) et utilisez simplement la fonction lambda dans la boucle for pour utiliser displayfor. DisplayFor nécessite une fonction lambda.

J’ai également eu beaucoup de mal à comprendre les codes générés par Visual Studio. Au lieu de fournir une explication générale sur l’expression lambda, j’aimerais mettre un contexte en utilisant le framework ASP.NET MVC.

Supposons que nous ayons préparé une classe de modèle (par exemple, une destination) avec 2 atsortingbuts: City et ProvinceCode.

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

Après avoir généré le contrôleur et la vue, nous devrions obtenir les codes générés par Visual Studio, comme mentionné. Cependant, les codes générés sont quelque peu difficiles à comprendre, en particulier pour les lignes de données.

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

Je suppose que l’équipe MVC devrait penser que la classe d’assistance HTML doit être utilisée de manière cohérente dans le fichier cshtml. Ainsi, ils ont essayé d’utiliser des astuces pour passer le compilateur C #. Dans ce cas, modelItem n’est même pas utilisé comme paramètre d’entrée de cette expression lambda. Nous ne pouvons pas utiliser () car le type n’est pas correct. C’est pourquoi, si nous remplaçons le modèle ou tout object modèle, l’expression lambda fonctionne.

Pour être honnête, je voudrais réécrire les codes générés sous une forme plus lisible. Au lieu d’utiliser la classe d’assistance HTML , nous pouvons simplement rendre la sortie correcte comme suit:

 @foreach (var item in Model) {   @* 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   }