Как визуализировать DateTime в определенном формате в ASP.NET MVC 3?

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

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

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

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

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

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

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

Edit

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.

Ответ 1

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

@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")

Ответ 2

Вы можете украсить свое свойство модели просмотра атрибутом [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())

Ответ 3

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

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

или в цикле foreach

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

Ответ 4

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

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

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

Ответ 5

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

В папке "Представления" создайте папку с именем "DisplayTemplates" либо в папке с определенными разрешениями вашего диспетчера, либо в папке "Общие" (эти работы похожи на частичные).

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

@model System.DateTime
@Model.ToLongDateString()

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

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

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

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

Ответ 6

Мое предпочтение заключается в том, чтобы сохранить детали форматирования с видом, а не с viewmodel. Итак, в 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")
    });
});

такой слабый, но должен охватывать множество случаев.

Ответ 7

работает для меня

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>

Ответ 8

С той же проблемой в последнее время.

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

[DataType(DataType.Date)]
public DateTime Added { get; set; }

Ответ 9

Если я просто хочу показать дату в коротком формате, я просто использую @Model.date.ToShortDateString() и печатает дату в

Ответ 10

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

@Model.LeadDate.ToString("dd-MMM-yyyy")

@Model.LeadDate.ToString("MM/dd/yy")

Это приведет к следующему формату:

26-Apr-2013

04/26/13

Ответ 11

это отобразится в формате dd/MM/yyyy в представлении

В представлении:

вместо DisplayFor используйте этот код

<td>

@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")

</td

он также проверяет, имеет ли значение значение null в столбце даты, если true, тогда он отобразит "Дата пуста" или фактическая форматированная дата из столбца.

Надежда помогает кому-то.

Ответ 12

@{
  string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");        
  @datein
}

Ответ 13

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

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

Ответ 14

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

Ответ 15

Только просмотр файла. Вы можете попробовать это.

@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), 
                            "{0: yyyy-MM-dd}")

item.transdate это ваши данные типа DateTime.