Цель выражения лямбда на представлении «Бритва» возвращает значение, заданное моделью из анонимной функции (т. Е. Безымянная функция). Посмотрите на первый пример:
@Html.DisplayFor(modelItem => item.FirstName)
будет переведен на что-то вроде:
@Html.DisplayFor(String Function(Model modelItem)
{
return item.FirstName;
})
Здесь modelItem
дается в качестве параметра функции, объявленной в качестве Model
и оператора возврата, как функции тела, чтобы вернуть значение свойства в зависимости на операции get/set.
Если мы посмотрим дальше на DisplayFor
хелперах декларацию:
public static MvcHtmlString DisplayFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression,
string templateName
)
Как заявили @SLaks прежде, выражение дерево может быть разобрано в качестве параметра для создания правильного HTML тега в поле зрения на основе от типа вашей модели определяется директивой @model
вместо его выполнения.
Второй аргумент, Expression<Func<TModel, TValue>>
- это объявление, которое гарантирует, что любой заданный параметр функции всегда будет иметь тот же тип, что и ваша модель. Таким образом, исключается код отражения, который использует GetProperty
и GetValue
, необходимые хелперу HTML для получения заданного значения свойства в соответствующее время с сильно типизированной моделью в качестве преимущества.
Вот пример кода отражения внутри хелперов декларации HTML, которые могут быть устранены с помощью синтаксиса лямбда:
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();
}
Затем, давайте рассмотрим второй пример:
@Html.DisplayFor(item.FirstName)
Здесь DisplayFor
будет использовать Object
как тип параметра, рассмотрим, что мы не можем точно определить, какой тип должен быть предварительно назначен, поэтому он устанавливает значение System.Object
. Поскольку метод не предоставляет тип определения модели как TModel
в общем коде, метод, вероятно, требует отражения при работе со значением свойства.
Любые улучшения и предложения приветствуются.
Ссылки:
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)
Это на самом деле часть MVC, а не бритвой. – SLaks