MVC HTML Helpers и выражения lambda

Я понимаю запросы Lambda по большей части, но когда я пытаюсь изучить MVC, и я вижу шаблоны лесов по умолчанию, они используют выражения Lambda для стольких компонентов.

Одним из них является помощник DisplayFor HTML. Код идет @Html.DisplayFor(model => model.name)

Надеюсь, никто не думает, что это глупый вопрос, просто я, хотя я (думаю, что я) понимаю выражения Лямбды по большей части, они не «текут», как обычный код, и я должен думать об этом довольно трудно понять что на самом деле происходит!

Так что на самом деле вопрос,

1) есть ли какая-либо выгода, которую мне не хватает им, используя Lambda-запросы для этих помощников HTML?

2) Насколько я могу судить, DisplayFor будет привязан только к одному элементу – так почему же это не просто @Html.DisplayFor(model.name) или подобное?

И, пожалуйста, дайте любую другую информацию, которая может сделать новичка MVC лучше!

Прежде чем ответить на ваши 2 балла, я думаю, вам нужно понять, что на самом деле есть lambda-выражения.

В .Net выражения Lambda, используемые таким образом, являются так называемыми деревьями выражений. Из MSDN :

Деревья выражений представляют код в древовидной структуре данных, где каждый узел является выражением, например, вызовом метода или двоичной операцией, такой как x

Это, по сути, структуры данных, которые описывают, что передается, а не значения передаваемых данных. Это означает, что когда вы вызываете Html.DisplayFor(x => model.Name) он передает структуру данных, которая говорит: «Я вызываю этот метод для свойства Name структуры данных xxxx (где xxxx – это тип структуры данных, представляющий вашу модель просмотра).

Затем DisplayFor просматривает эти данные и видит, что имя свойства Name is well Name, оно рассматривает все атрибуты для свойства, чтобы узнать, есть ли у вас какие-либо annotations данных, прикрепленные к нему, а затем просматривает значение, чтобы определить, как представлять дисплей для значения. Это немного сложно, пока вы не обернете свою голову, но как только вы посмотрите на страницу MSDN и подумаете об этом, у вас будет ага! момент, как я, и это будет просто внезапно смысл 🙂

Что касается вашего вопроса №1, то преимущество использования lambda-выражений заключается в том, что вы проверяете время компиляции своих свойств. Например, если вы переименуете ViewModel.Name в ViewModel.ClientName , все ваши Html.DisplayFor(x => model.Name) не будут компилироваться, поэтому вы обязательно их измените. Если вы не используете lambda-выражения, все ваши Html.Display() будут работать, но вы получите скрытые ошибки с привязкой к модели, которые не будут сразу очевидны из-за того, что не так.

Чтобы ответить на # 2, причина такая же, как и мое описание деревьев выражений. Без использования lambdas вы просто передаете значение Model.Name без информации о самом свойстве, поэтому оно не знает, что имя свойства Model.Name является Name , все, что он видит, является строковым значением.

Здесь также можно найти еще одну хорошую репликацию Деревьев выражений. Понимание деревьев выражений открывает много мощности в .Net 🙂

У вас есть возможность использовать альтернативу, аналогичную тому, что у вас есть выше. В этом случае на самом деле это будет @Html.Display("name") без части «For» и с именем свойства модели, переданным в виде строки. Это альтернатива OK. Если ваше имя свойства изменяется, хотя это будет ломаться во время выполнения.

Мне нравится lambda, потому что я реферирующий наркоман, который постоянно переименовывает вещи. Включив компиляцию вида, я смогу затем опираться на компилятор, чтобы помочь мне найти места, в которых мне нужно обновить свои представления.

  • Имеют ли переменные захвата lambdas c ++ 11, которые они не используют?
  • Почему я не могу захватить эту ссылку ('& this') в lambda?
  • В чем разница между привязкой лямбды и метода на уровне выполнения?
  • Захват переменной lambda в цикле - что здесь происходит?
  • Необязательный orElse Необязательный в Java
  • Указатели функций, Закрытие и Лямбда
  • Java 8 Список в карту
  • Как динамически выполнять фильтрацию в Java 8?
  • Что такое lambda-выражение в C ++ 11?
  • Как применить несколько предикатов к java.util.Stream?
  • Почему filter () после того, как flatMap () «не полностью» ленив в streamах Java?
  • Давайте будем гением компьютера.