MVC HTML Helpers and Lambda Expressions

Вещь, что мне нравятся больше всего о Lisp (и Smalltalk) системы, состоит в том, что они чувствуют себя живыми. Можно легко зондировать & измените системы Lisp, в то время как они работают.

, Если это звучит таинственным, запустите Emacs и введите некоторый код Lisp. Тип C-M-x и voilГ! Вы просто изменили Emacs из Emacs. Можно пойти и переопределить все функции Emacs, в то время как это работает.

Другая вещь состоит в том, что код = перечисляет эквивалентность, делают границу между кодом и данными очень тонкой. И благодаря макросам, очень легко расширить язык и сделать быстрым DSLs.

, Например, возможно кодировать основного разработчика HTML, с которым код очень близко к произведенному выводу HTML:

(html
  (head
    (title "The Title"))
  (body
    (h1 "The Headline" :class "headline")
    (p "Some text here" :id "content")))

=>


  
    The title
  
  
    

The Headline

Some text here

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

26
задан tereško 28 May 2013 в 21:27
поделиться

1 ответ

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

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

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

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

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

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

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

Другая хорошая запись Деревьев Выражений может быть найдена здесь . Понимание деревьев выражений открывает широкие возможности в .Net:)

23
ответ дан 28 November 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: