2016-07-28 17 views
2

Ich denke, mein Verständnis der Lambda-Notation fehlt, weil ich nicht verstehe, warum es in Razor überhaupt benötigt wird. Zum Beispiel:Warum wird Lambda Notation in Razor benötigt?

statt dessen:

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

warum können wir nicht nur diese haben:

@Html.DisplayFor(item.FirstName) 

Was ist der Zweck der Lambda-Syntax ist und warum brauchen wir in hinzufügen all die zusätzliche Arbeit der Eingabe der Lambda-Notation?

Kann mir jemand helfen zu verstehen, warum das nötig ist und welchen Nutzen es bietet?

+0

, die tatsächlich Teil der MVC ist, nicht Razor. – SLaks

Antwort

4

Die HtmlHelper Methoden verwenden einen Ausdrucksbaum als Parameter.

Dadurch können sie die tatsächliche Eigenschaft sehen, die Sie übergeben, damit sie ihre Attribute beobachten können.

+0

Wie auch immer, Sie senden den Parameter richtig? –

+0

Ja, aber mit einem Ausdrucksbaum können Sie auch die 'PropertyInfo' sehen. Andernfalls hätten sie keine Möglichkeit, Formatierungsattribute zu verwenden. – SLaks

+0

Sorry, aber was ist PropertyInfo? –

6

Der Zweck des Lambda-Ausdrucks in der Razor-Ansicht ist die Rückgabe des Werts, der vom Modell aus der anonymen Funktion (d. H. Namenlose Funktion) gegeben wird. Werfen Sie einen Blick auf Ihre erste Beispiel:

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

wie etwas übersetzt würde:

@Html.DisplayFor(String Function(Model modelItem) 
{ 
    return item.FirstName; 
}) 

modelItem hier als Funktionsparameter gegeben deklariert als Model und return-Anweisung als Funktion Körper zurückzukehren Eigenschaftswert je auf get/set Betrieb.

Wenn wir die DisplayFor Helfer Erklärung weiter suchen:

public static MvcHtmlString DisplayFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression, 
    string templateName 
) 

nach wie vor von @SLaks erwähnt, kann Ausdrucksbaum als Parameter analysiert werden, um korrekten HTML-Tag in dem Blick vom Typ des Modells definiert zu generieren von @model Direktive, anstatt es auszuführen.

Das zweite Argument, Expression<Func<TModel, TValue>>, ist eine Deklaration, die sicherstellt, dass ein gegebener Funktionsparameter immer denselben Typ wie Ihr Modell hat. Auf diese Weise wird der Reflektionscode eliminiert, der den vom HTML-Helfer benötigten Code GetProperty und GetValue verwendet, um den angegebenen Eigenschaftswert zum richtigen Zeitpunkt mit einem stark typisierten Modell als Vorteil abzurufen. Hier

ist ein Beispiel für Reflexion Code in HTML-Hilfs Erklärung, die von Lambda-Syntax beseitigt werden kann:

var model = html.ViewData.Model; 
var value = String.Empty; 

if (model != null) 
{ 
    var type = typeof(TModel); 
    var propertyInfo = type.GetProperty(templateName); 
    var propertyValue = propertyInfo.GetValue(model); 
    value = propertyValue.ToString(); 
} 

Danach lassen Sie uns das zweite Beispiel untersuchen:

@Html.DisplayFor(item.FirstName) 

Hier DisplayFor wird verwenden Object Als Parametertyp können wir nicht genau bestimmen, welcher Typ vorbelegt werden soll, daher wird er auf System.Object gesetzt. Da die Methode keinen Modelldefinitionstyp wie TModel im generischen Code zur Verfügung stellt, erfordert die Methode wahrscheinlich eine Reflexion beim Umgang mit dem Eigenschaftswert.

Alle Verbesserungen und Anregungen willkommen.

Referenzen:

https://msdn.microsoft.com/en-us/library/hh833706%28v=vs.118%29.aspx

http://odetocode.com/blogs/scott/archive/2012/11/26/why-all-the-lambdas.aspx

I want to understand the lambda expression in @Html.DisplayFor(modelItem => item.FirstName)