Как использовать Humanize внутри @ Html, DisplayFor () - PullRequest
0 голосов
/ 25 октября 2018

Как я могу отобразить дату Humanizely внутри DisplayFor?

Я пытался так: @Html.DisplayFor(model =>model.EndDate.Humanize())

, но редактор показывает ошибку вроде:

anДерево выражений не может содержать вызов или вызов, использующий необязательные аргументы

1 Ответ

0 голосов
/ 25 октября 2018

Html.DisplayFor - шаблонный помощник, который просто означает, что он возвращает значение выражения модели, используя шаблон.Шаблон по умолчанию просто вызывает ToString() для свойства, на которое ссылается выражение модели.Таким образом, то, что вы передаете в него, должно быть модельным выражением, ссылающимся на определенное свойство;Вы не можете сделать что-то вроде вызова Humanize.

Однако вы можете определить свой собственный шаблон.Это влечет за собой создание представления в Views\Shared\DisplayTemplates, которое соответствует одному из следующих соглашений об именах:

  1. Он назван в соответствии с типом, для которого он должен использоваться, например, DateTime.cshtml будет применяться клюбое свойство типа DateTime.

  2. Оно названо в честь одного из членов перечисления DataType, и в этом случае оно используется, когда этот DataType применяется копределенное свойство, например Date.cshtml, будет использоваться при применении атрибута [DataType(DataType.Date)].

  3. Оно называется как угодно, но это имя явно указывается для свойства с помощью *Атрибут 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 или атрибуты свойств вашей модели.

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