Html.DisplayFor
- шаблонный помощник, который просто означает, что он возвращает значение выражения модели, используя шаблон.Шаблон по умолчанию просто вызывает ToString()
для свойства, на которое ссылается выражение модели.Таким образом, то, что вы передаете в него, должно быть модельным выражением, ссылающимся на определенное свойство;Вы не можете сделать что-то вроде вызова Humanize
.
Однако вы можете определить свой собственный шаблон.Это влечет за собой создание представления в Views\Shared\DisplayTemplates
, которое соответствует одному из следующих соглашений об именах:
Он назван в соответствии с типом, для которого он должен использоваться, например, DateTime.cshtml
будет применяться клюбое свойство типа DateTime
.
Оно названо в честь одного из членов перечисления DataType
, и в этом случае оно используется, когда этот DataType
применяется копределенное свойство, например Date.cshtml
, будет использоваться при применении атрибута [DataType(DataType.Date)]
.
Оно называется как угодно, но это имя явно указывается для свойства с помощью *Атрибут 1025 *, например, если вы примените атрибут, такой как [UIHint("MyAwesomeDateTime")]
, и будет использоваться связанный MyAwesomeDateTime.cshtml
вид.
Таким образом, если бы вы создали вид, подобный Views\Shared\DisplayTemplates\DateTime.cshtml
с содержанием:
@model DateTime
@Model.Humanize()
Затем, просто позвонив по номеру @Html.DisplayFor(m => m.EndDate)
, вы получите нужную вам гуманизированную дату.Поскольку EndDate
является DateTime
, DisplayFor
будет использовать ваш шаблон DateTime.cshtml
, который выводит модель (ваш DateTime
с Humanized
в цепочке.
Альтернативный способ указать шаблон отображенияэто передать его напрямую. Это полезно, когда у вас разовая ситуация и вы не хотите, чтобы шаблон применялся к всем определенного типа. Например, если вы просто хотели EndDate
Гуманизированные, но другие даты для отображения в обычном режиме, которые могут быть достигнуты с помощью чего-то вроде:
@Html.DisplayFor(m => m.EndDate, "HumanizedDate")
Тогда вам, конечно, понадобится связанный HumanizedDate.cshtml
. Вы также можете использовать UIHint
на своемсвойство, как описано выше здесь, если вы предпочитаете держать это вне поля зрения, и вместо этого для вашей модели.
Все вышесказанное, шаблоны отображения лучше всего использовать, когда речь идет о сложных конструкциях. Как отметил Стивенв комментариях под вашим вопросом вы можете просто сделать: @Model.EndDate.Humanize()
, что не только более кратко и явно, чем @Html.DisplayFor(m => m.EndDate)
, но и не требует добавления пользовательских views или атрибуты свойств вашей модели.