Где лучше всего отформатировать свойства модели в ASP.NET MVC (3)?

Недавно я много искал как лучшие практики в рамках ASP.NET MVC, в частности, вокруг раздувания беспокойства. Мой вопрос здесь, если у меня есть свойство на модели, где лучше всего сделать какое-то форматирование на этом свойстве?

Я подумал о нескольких вариантах, но не уверен, что лучше. В этом примере используется DateTime. Извините, это немного задержалось.

Вариант 1: В представлении: @Model.TheDate.String("{0:'blah'dd/MM/yyyy}") Я знаю, что это неправильно, потому что строка формата не должна быть здесь (что, если я хочу изменить формат во всем приложении)

Вариант 2: Метод расширения, используемый в представлении: @Model.TheDate.DisplayItNicePlease() Такой подход имеет смысл, поскольку в представлении используется метод расширения, который используется для форматирования, и viewmodel просто предоставляет свойство даты для представления. Не уверен, что модель представления или представления должна нести ответственность за форматирование.

Вариант 3: В методе Html Helper, т.е. Что-то вроде Где я должен разместить декларативные HTML-помощники в ASP.NET MVC 3, чтобы вы могли использовать:

@Html.DisplayDateNice(Model.TheDate)

Вариант 4: Дополнительное свойство в модели представления для его форматирования и возврата строки, например:

public string TheDateStr
{
    get
    {
        return TheDate.DisplayItNicePlease();
    }
}

И тогда в представлении вы просто

@Model.TheDateStr

Довольно похоже на вариант 3 только он сохраняет представление действительно, очень просто - представление буквально просто выводит то, что находится в модели, и не заботится о формате данных.

Вариант 5: Атрибуты DisplayFormat, например: На модели просмотра:

[DisplayFormat(DataFormatString = "{0:'blah'dd/MM/yyyy}")]
public DateTime TheDate { get; set; }

И затем на вид:

@Html.DisplayFor(m => m.TheDate)

Мне это нравится, кроме того, строка формата не используется повторно, поэтому используйте опцию 5...

Вариант 6: Какой-то пользовательский DisplayFormatAttribute, например. NiceDateDisplayFormatAttribute. Мне кажется, что это может быть самое приятное решение и хорошо работает, если вы просто хотите простое форматирование строк. Я думаю, что это усложняется, если вам нужно что-то более сложное, например, показывая относительное время (Рассчитать относительное время в С#), и в этом случае, возможно, это лучше всего в расширении method/html.

Есть, вероятно, другие способы, о которых я даже не знаю...

Ответ 1

Либо используйте помощник расширения для форматирования типа, если форматирование этого типа будет использоваться много или добавит дополнительное свойство в Модели, чтобы вернуть отформатированную версию исходного свойства.

Ответ 2

Для одного представления я лично использую вариант 5: поместив его в модель представления. Если формат даты используется для нескольких страниц, вы можете создать вспомогательное расширение html для форматирования даты. Таким образом, в представлении у вас есть что-то вроде

@Model.TheDate.ToDateString()

Но в целом я по-прежнему предпочитаю вариант5, потому что я создаю viewmodels для каждой страницы и просто бросаю на него атрибут DisplayFormat.