ASP.NET MVC: строго типизированные HTML-помощники - PullRequest
3 голосов
/ 05 января 2012

Давайте возьмем эту строку: @Html.LabelFor(m => m.UserName) который находится на странице с этой строкой: @model CurrencyMvc.Models.RegisterModel

Я полагаю, что при визуализации представления страницы LabelFor вызывается автоматически со ссылкой на описанную модель, и что функция Lambda сообщает, как получить необходимую информацию из модели?

Мне не понятно, почему мы передаем функцию, когда мы можем передать фактическое значение, например m.Username.

О, а когда этот помощник называется, откуда взялась буква "м"?

Ответы [ 3 ]

6 голосов
/ 05 января 2012

Есть 2 класса, которые используются для бритвенных страниц (второй происходит от первого):

  1. System.Web.Mvc.WebViewPage
  2. System.Web.Mvc.WebViewPage<T>

Таким образом, когда вы используете строго типизированное представление с указанием модели, ваше представление основывается на универсальной версии, а свойство Html является обобщенным HtmlHelper<TModel>. Поскольку всегда рекомендуется использовать строго типизированные представления, я больше не буду говорить о первом классе, поскольку он не представляет интереса.

Давайте посмотрим на сигнатуру метода расширения LabelFor:

public static MvcHtmlString LabelFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression
)
{
    ...
}

Как видно из этого определения, метод LabelFor является методом расширения для класса HtmlHelper<TModel>, который принимает 1 аргумент. Этот метод доступен, только если у вас строго типизированное представление. Аргумент представляет лямбда-выражение, которое ограничено только выражениями доступа к элементу (помощник сгенерирует исключение, если вы попытаетесь использовать какие-то причудливые вещи). Он принимает модель в качестве аргумента и свойство этой модели должно быть возвращено.

Благодаря этой информации помощник может определить имя указанного члена и, следовательно, создать правильную разметку. А поскольку аргумент является лямбда-выражением, он также может определять метаданные этого свойства (возможно, вы украсили свойство модели представления такими атрибутами, как [DisplayName], ... что позволяет указывать дополнительные метаданные). Если помощник принял только значение, как вы просили: Html.LabelFor(Model.SomeValue), вы понимаете, что внутри этого LabelFor метода вы получите только это значение. Вы никогда не сможете получить доступ к метаданным модели представления, которая является фундаментальным понятием в ASP.NET MVC.

4 голосов
/ 05 января 2012

Я предполагаю, что когда представление страницы отрисовывается, LabelFor вызывается автоматически со ссылкой на описанную модель, и что функция Lambda сообщает, как получить необходимую информацию из модели?

Я не совсем уверен, что понимаю, что вы имеете в виду под этой частью, я думаю, вы имеете в виду, как @LabelFor знает, какую модель использовать?

Ну да, если вы посмотрите на синтаксис , который выглядит следующим образом:

public static MvcHtmlString LabelFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression
)

Вы можете видеть, что первый параметр начинается с this, что делает его методом расширения.Когда вы добавляете строку, @model CurrencyMvc.Models.RegisterModel this HtmlHelper<TModel> становится вашим RegisterModel.

Мне не понятно, почему мы передаем функцию, когда мы можем передать фактическое значение egmUsername.

В большинстве случаев «лямбда-выражение» - это просто Func<T>, но с бритвой @Html.xfor (например, @Html.LabelFor), которую вы передаете в Expression<Func<TModel, TValue>> - древовидная структура данных для лямбда-выражения.С точки зрения непрофессионала;вид нескомпилированного Func.

Если вы передадите m.Username, метод будет просто иметь "Dale Burrell".Но, например, текстовое поле html генерируется как

<input type="text" name="Username" value="Dale Burrell">

Итак, как вы можете видеть, ему действительно нужно m.Username имя переменной

Oh, и когда этот помощник вызывается где«m» взято?

Это просто переменная.Также как foreach(var m in dataset){} "откуда взялся м?"- Вы сделали это.Вы можете заменить м на что угодно

3 голосов
/ 16 октября 2013

Я знаю, что это было некоторое время, но я думаю, что ссылка ниже будет весьма полезна для тех, кто все еще ищет хорошее объяснение.http://odetocode.com/blogs/scott/archive/2012/11/26/why-all-the-lambdas.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...