Как визуализировать 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
.