Посмотрите фактической сигнатуры метода (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>
, и с этим вызовом вы предоставили ее.
44 Это может быть любое ваше желание - чаще всего '@ Html.DisplayNameFor (m => m.Title)' Его просто говорят: _ для моей модели, которую я назову 'm' в этом методе, дайте мне' Title' свойства 'm'_ –
@StephenMuecke, есть ли у вас ссылка на любую документацию, чтобы объяснить, как это работает? Если он уже знает, что что-либо переданное следует рассматривать как модельный объект, почему нам нужно выражение лямбда вместо «ничего. Титул»? – user3885927
Ну, вы также можете просто передать строку, используя '@ 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) –