#c# #asp.net-mvc
#c# #asp.net-mvc
Вопрос:
У меня есть дата, которая отображается на моем View
, которая показывает последнюю дату входа пользователя в систему. Возможно, они никогда этого не делали. Итак, это передается как nullable DateTime
.
В пользовательском интерфейсе я отображаю это следующим образом:
<td>@(u.LastVisit != null ? u.LastVisit.Value.ToString("dd-MMM-yyyy") : "Not yet")</td>
Но у меня есть несколько проблем с этим, и я думаю, что это может быть плохой практикой.
Во-первых, представление теперь имеет логику. (Если null, покажите «Еще нет», иначе покажите дату). Представление также определяет формат даты. Этот формат уже сохранен как константа в файле Constants, доступном с моего контроллера. И текст «Еще нет», вероятно, также должен быть константой.
Единственный способ, которым я могу обойти это, — вернуть строку в пользовательский интерфейс и переместить эту логику в контроллер. Но правильный ли это способ сделать это?
Комментарии:
1. Вы можете использовать атрибут DisplayFormat и задать свойства
DataFormatString
иNullDisplayText
, а в представлении использовать@Html.DisplayFor(m => m.LastVisit)
2. DisplayFor использует модель, я думаю? Я нахожусь в ‘foreach’ из свойства List<> в моей модели. Итак, у меня есть объект (u, в данном случае, который является пользователем в списке<User>. Я не уверен, как я могу использовать этот пользовательский элемент в DisplayFor. Похоже, ему нужна модель.
3. Тогда это просто
DisplayFor(m => u.LastVisit)
(илиDisplayFor(m => m[i].LastVisit)
, если этоfor
цикл)4. Идеально! Если вы дадите ответ, я могу пометить его как идеальный.
Ответ №1:
Вы можете применить [DisplayFormat]
атрибут к свойству и задать DataFormatString
и NullDisplayText
свойства, например
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", NullDisplayText = "Not yet")]
public DateTime? LastVisit { get; set; }
Если вы уже определили некоторые константы для формата, вы можете использовать (например), DataFormatString = yourAssembly.Constants.DateFormat
где DateFormat
определяется как
public const string DateFormat = "{0:dd-MMM-yyyy}";
и в представлении использовать DisplayFor()
@foreach(var u in Model)
{
@Html.DisplayFor(m => u.LastVisit)
}