2015-04-17 2 views
3

Я делаю this Учебник MVC, и я не понимаю входной параметр в выражении лямбда внутри метода @Html.DisplayNameFor. Изображение ниже имеетAsp.net вид бритвы - входы ямбы выражения

@ Html.DisplayNameFor (модель => model.Title)

, но это работает хорошо, даже если я изменить его на

@ Html.DisplayNameFor (что-то => something.Title)

Так что мой вопрос заключается в том, как это переменные model или something получение объявленных и как значения заполняются? Все, что я вижу, они просто предоставляются в качестве вклада в выражение лямбда.

Index view for Movies controller

+3

44 Это может быть любое ваше желание - чаще всего '@ Html.DisplayNameFor (m => m.Title)' Его просто говорят: _ для моей модели, которую я назову 'm' в этом методе, дайте мне' Title' свойства 'm'_ –

+0

@StephenMuecke, есть ли у вас ссылка на любую документацию, чтобы объяснить, как это работает? Если он уже знает, что что-либо переданное следует рассматривать как модельный объект, почему нам нужно выражение лямбда вместо «ничего. Титул»? – user3885927

+0

Ну, вы также можете просто передать строку, используя '@ Html.Display (« Title »)'. Я хотел бы начать с изучения некоторых результатов этого поиска [учебник по математическим выражениям mvc lambda] (https://www.google.com.au/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q= mvc% 20lambda% 20expressions% 20tutorial) –

ответ

0

ASP.NET MVC Html Helpers разработаны таким образом, что они знают, что они всегда работают на экземпляре модели. See this MSDN doc, где он описывает работу HtmlHelper, которая представляет собой общую модель. Поскольку лямбда всегда ожидает ввода некоторого свойства модели, на самом деле не имеет значения, что вы называете вводом.

Подумайте, если функция была написана так:

public string DisplayNameFor(string textToDisplay) 
{ 
    displayStuff(); 
} 

Что вы могли бы назвать как:

DisplayNameFor(model.Title); 

или что то же самое:

DisplayNameFor(something.Title); 

DisplayNameFor() на самом деле не волнует, что вход называется, просто что это строка. Html-помощники работают аналогичным образом, ожидая вызова с экземпляром модели.

1

Посмотрите фактической сигнатуры метода (from MSDN documentation)

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

DisplayFor на самом деле метод расширения, который будет доступен на HtmlHelper<TModel> случаях, когда TModel тип вашей модели, как это определено тип которого указан в директиве @Model.

Как вы можете видеть, второй аргумент - Expression<Func<TModel, TValue>>. Это означает, что в вызове, таком как: @Html.DisplayNameFor(x => x.Foo), x всегда будет тот же тип, что и тот, который вы указали с помощью @model, независимо от имени, которое вы используете.

Теперь у вас возник вопрос: как эти значения заселяются? Ну, так как вы заявили, что вы хотите модель типа IEnumerable<MvcMovie.Models.Movie>, теперь вы можете сделать что-то вроде этого в коде позади

public ActionResult MoviesView() 
{ 
    var model = new List<MvcMovie.Models.Movie>() 
    { 
     new Movie("Casablanca"), 
     new Movie("Fight Club"), 
     new Movie("Finding Nemo") 
    }; 

    return View(model); 
} 

Это будет как значения «заселены». Expression<Func<TModel, TValue>> ожидает модель IEnumerable<MvcMovie.Models.Movie>, и с этим вызовом вы предоставили ее.

Смежные вопросы