В последнее время я много смотрю на лучшие практики в рамках ASP.NET MVC, в частности, на разделение задач. Мой вопрос заключается в том, что если у меня есть свойство в модели, где лучше всего сделать форматирование этого свойства?
Я обдумал несколько вариантов, но не уверен, какой из них лучше. В примере используется DateTime. Извините, что получилось немного длинно.
Вариант 1:
В представлении: @Model.TheDate.String("{0:'blah'dd/MM/yyyy}")
Я знаю, что это неправильно, потому что строка формата не должна быть здесь (что, если я хочу изменить формат во всем приложении)
Вариант 2:
Метод расширения, используемый в представлении: @Model.TheDate.DisplayItNicePlease()
Это вроде как имеет смысл, потому что представление выбирает метод расширения, который будет использоваться для форматирования, а модель представления просто раскрывает свойство даты для представления. Однако не совсем понятно, кто должен отвечать за форматирование - представление или модель представления.
Вариант 3: В методе Html Helper, т.е. что-то вроде Where should I place Declarative HTML helpers in 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; }
На модели представления:
[DisplayFormat(DataFormatString = "{0:'blah'dd/MM/yyyy}")]
public DateTime TheDate { get; set; }
И затем на представлении:
@Html.DisplayFor(m => m.TheDate)
Мне это нравится, кроме того, что строка формата не используется повторно, так что продолжайте вариант 5...
Вариант 6:
DisplayFormatAttribute
, например, NiceDateDisplayFormatAttribute
.
Мне кажется, что это самое приятное решение, и оно хорошо работает, если вам нужно простое форматирование строки. Я думаю, что все усложняется, если вам нужно что-то более сложное, например, отображение относительного времени (Calculate relative time in C#), в этом случае, возможно, это лучше сделать в методе расширения/html helper.
Возможно, есть и другие способы, о которых я даже не знаю...