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)
, die tatsächlich Teil der MVC ist, nicht Razor. – SLaks