Обработка логики и констант в представлении

#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)
}