2016-07-28 4 views
2

Я думаю, что мое понимание лямбда-нотации отсутствует, потому что я не понимаю, почему это даже необходимо в Razor. Например:Почему лямбда-нотация нужна даже в Razor?

вместо этого:

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

почему мы не можем просто так:

@Html.DisplayFor(item.FirstName) 

Какова цель синтаксиса лямбда и почему нам нужно добавить в всю дополнительную работу по набору лямбда-нотации?

Может кто-нибудь помочь мне понять, почему это необходимо и какую пользу оно предлагает?

+0

Это на самом деле часть MVC, а не бритвой. – SLaks

ответ

4

Методы HtmlHelper принимают дерево выражений в качестве параметра.

Это позволяет им видеть фактическое свойство, которое вы передаете, чтобы они могли наблюдать за его атрибутами.

+0

В любом случае, вы отправляете параметр, хотя верно? –

+0

Да, но с деревом выражений вы также можете увидеть 'PropertyInfo'. В противном случае у них не будет возможности использовать атрибуты форматирования. – SLaks

+0

Извините, но что такое PropertyInfo? –

6

Цель выражения лямбда на представлении «Бритва» возвращает значение, заданное моделью из анонимной функции (т. Е. Безымянная функция). Посмотрите на первый пример:

@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)