Как визуализировать DateTime в определенном формате в ASP.NET MVC 3? - PullRequest
116 голосов
/ 14 мая 2011

Если у меня в классе модели есть свойство типа DateTime, как я могу отобразить его в определенном формате - например, в формате, который возвращает ToLongDateString()?

Я пробовал это ...

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

... что вызывает исключение, поскольку выражение должно указывать на свойство или поле.И это ...

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

..., которое не выдает исключение, но визуализированный вывод пуст (хотя val содержит ожидаемое значение, как я мог видеть в отладчике).

Спасибо за советы заранее!

Редактировать

ToLongDateString является только примером.На самом деле я хочу использовать вместо ToLongDateString собственный метод расширения DateTime и DateTime?:

public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
    if (dateTime.TimeOfDay == TimeSpan.Zero)
        return dateTime.ToString("d");
    else
        return dateTime.ToString("g");
}

public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
    if (dateTime.HasValue)
        return dateTime.Value.FormatDateTimeHideMidNight();
    else
        return "";
}

Итак, я думаю, что не могу использовать атрибут DisplayFormat и DataFormatStringпараметр в свойствах ViewModel.

Ответы [ 15 ]

171 голосов
/ 14 мая 2011

Вы можете украсить свойство модели представления с помощью атрибута [DisplayFormat]:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
               ApplyFormatInEditMode = true)]
public DateTime MyDateTime { get; set; }

и по вашему мнению:

@Html.EditorFor(x => x.MyDate)

или, для отображения значения,

@Html.DisplayFor(x => x.MyDate)

Еще одна возможность, которую я не рекомендую, - использовать хелпер со слабым типом:

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())
159 голосов
/ 14 мая 2011

Если все, что вы хотите сделать, это отобразить дату в определенном формате, просто позвоните:

@String.Format(myFormat, Model.MyDateTime)

Использование @Html.DisplayFor(...) - это просто дополнительная работа, если вы не указываете шаблон или вам не нужно использовать что-то, что построено на шаблонах, например, повторять IEnumerable<T>. Создание шаблона достаточно просто и может обеспечить большую гибкость. Создайте папку в папке представлений для текущего контроллера (или папки общих представлений) с именем DisplayTemplates. Внутри этой папки добавьте частичное представление с типом модели, для которой вы хотите создать шаблон. В этом случае я добавил /Views/Shared/DisplayTemplates и добавил частичное представление под названием ShortDateTime.cshtml.

@model System.DateTime

@Model.ToShortDateString()

И теперь вы можете вызвать этот шаблон со следующей строкой:

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")
26 голосов
/ 07 ноября 2011

Простой форматированный вывод внутри модели

@String.Format("{0:d}", model.CreatedOn)

или в цикле foreach

@String.Format("{0:d}", item.CreatedOn)
23 голосов
/ 21 октября 2013

Я использую следующий подход для встроенного формата и отображения свойства даты из модели.

@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")

В противном случае при заполнении TextBox или редактора вы можете сделать, как предложил @Darin, украсив атрибут [DisplayFormat] атрибут.

9 голосов
/ 14 мая 2011

Если все ваши типы DateTime отображаются одинаково, вы можете использовать пользовательский шаблон отображения DateTime.

В папке «Представления» создайте папку с именем «DisplayTemplates» либо в папке представлений вашего контроллера, либо в папке «Shared» (они работают аналогично частичным).

Внутри создайте файл с именемDateTime.cshtml, который принимает DateTime в качестве @model и указывает, как вы хотите отобразить дату:

@model System.DateTime
@Model.ToLongDateString()

Теперь вы можете просто использовать это в своих представлениях, и это должно работать:

@Html.DisplayFor(mod => mod.MyDateTime)

Пока вы соблюдаете соглашение о добавлении его в папку «DisplayTemplates» и именовании файла в соответствии с отображаемым типом, MVC автоматически использует его для отображения ваших значений.Это также работает для редактирования сценариев с использованием «EditorTemplates».

Вот еще немного информации о шаблонах .

7 голосов
/ 25 июня 2013

Я предпочитаю сохранять детали форматирования с видом, а не с моделью представления.Таким образом, в MVC4 / Razor:

@Html.TextBoxFor(model => model.DateTime, "{0:d}");

ссылка на формат даты и времени: http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

Тогда у меня есть привязка к датчику JQuery, и эта дата помещается в другой формат..doh!

Похоже, мне нужно установить формат DatePicker на то же форматирование.

Поэтому я сохраняю форматирование System.Globalization в атрибуте data- * и собираю его при настройкевверх по

@Html.TextBoxFor(
    model => model.DateTime.Date, 
    "{0:d}", 
    new 
    { 
        @class = "datePicker", 
        @data_date_format=System.Globalization.CultureInfo
                          .CurrentUICulture.DateTimeFormat.ShortDatePattern 
    }));

А вот отстойная часть: форматы .net и datepicker не совпадают, поэтому требуется взлом:

$('.datePicker').each(function(){
    $(this).datepicker({
        dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
    });
});

это слабовато, но должно охватыватьмного дел.

2 голосов
/ 22 февраля 2015

Недавно была такая же проблема.

Я обнаружил, что простое определение DataType как Дата в модели также работает (с использованием подхода Code First)

[DataType(DataType.Date)]
public DateTime Added { get; set; }
2 голосов
/ 21 августа 2013

у меня работает

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
1 голос
/ 12 октября 2016

вы можете сделать так @item.Date.Value.Tostring("dd-MMM-yy");

0 голосов
/ 09 сентября 2016

В MVC5 я бы использовал, если ваша модель - дата-время

string dt = Model.ToString("dd/MM/yyy"); 

Или, если ваша модель содержит свойство datetime

string dt = Model.dateinModel.ToString("dd/MM/yyy"); 

Вот официальное значение форматов:

https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx

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