Подтвердить что ты не робот

MVC HTML Helpers и выражения лямбда

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

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

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

Итак, на самом деле вопрос:

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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