@Html.DisplayFor - DateFormat ( "mm/dd/yyyy" )
У меня есть следующий код бритвы, который я хочу иметь формат даты mm/dd/yyyy
:
Audit Date: @Html.DisplayFor(Model => Model.AuditDate)
Я пробовал несколько разных подходов, но ни один из этих подходов не работает в моей ситуации
my AuditDate - это тип DateTime?
Я пробовал что-то вроде этого и получил эту ошибку:
@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())
Дополнительная информация: Шаблоны могут использоваться только с доступом к полю, доступом к ресурсам, индексом одномерного массива или однопараметрическими пользовательскими выражениями индексатора.
Пробовал это:
@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))
Нет перегрузки для метода 'ToString' принимает 1 аргумент
Ответы
Ответ 1
Если вы используете DisplayFor
, вам нужно либо определить формат с помощью атрибута DisplayFormat
, либо использовать настраиваемый шаблон отображения. (Полный список предустановленных DisplayFormatString
можно найти здесь.)
[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime? AuditDate { get; set; }
Или создайте представление Views\Shared\DisplayTemplates\DateTime.cshtml
:
@model DateTime?
@if (Model.HasValue)
{
@Model.Value.ToString("MM/dd/yyyy")
}
Это применимо ко всем DateTime
s, хотя и к тем, где вы также кодируете время. Если вы хотите, чтобы он применялся только к свойствам только для даты, используйте атрибут Views\Shared\DisplayTemplates\Date.cshtml
и DataType
для вашего свойства:
[DataType(DataType.Date)]
public DateTime? AuditDate { get; set; }
Последний вариант заключается в том, чтобы не использовать DisplayFor
и вместо этого отображать свойство напрямую:
@if (Model.AuditDate.HasValue)
{
@Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
Ответ 2
Если вы просто выводите значение этого свойства модели, вам не нужен помощник по HTML для DisplayFor
, просто вызовите его напрямую с правильным форматированием строки.
Audit Date: @Model.AuditDate.Value.ToString("d")
Должен выводить
Audit Date: 1/21/2015
Наконец, ваша дата аудита может быть нулевой, поэтому вы должны выполнить условную проверку, прежде чем пытаться отформатировать обнуляемое значение.
@if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}
Получив сообщение об ошибке, вы получите этот ответ, который показывает, что ошибка связана с использованием слова Model в ваших Html-помощниках. Например, используя @Html.DisplayFor(Model=>Model.someProperty)
. Измените их, чтобы использовать что-то другое, кроме Model
, например: @Html.DisplayFor(x=>x.someProperty)
или измените заглавную букву M
на строчные m
в этих помощниках.
Ответ 3
@ChrisPratt неправильный ответ об использовании шаблона отображения. Правильный код для работы:
@model DateTime?
@if (Model.HasValue)
{
@Convert.ToDateTime(Model).ToString("MM/dd/yyyy")
}
Это потому, что .ToString()
для Nullable<DateTime>
не принимает параметр Format
.
Ответ 4
Я реализовал подобное:
- Используйте TextBoxFor для отображения даты в нужном формате и введите поле только для чтения.
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})
2. Дайте нулевую схему и нулевую рамку в TextBox в css.
.my-style {
outline: none;
border: none;
}
И...... Сделано:)
Ответ 5
Для меня было достаточно использовать
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }
Ответ 6
После некоторого рытья, и я закончил установку Thread
CurrentCulture, чтобы CultureInfo ( "en-US" ) в методе действий контроллеров:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Вот несколько других параметров, если вы хотите иметь эту настройку для каждого вида.
О значении свойства CurrentCulture
:
Объект CultureInfo, который возвращается этим свойством, вместе с связанными с ним объектами, определить формат по умолчанию для дат, раз, цифры, значения валюты, порядок сортировки текста, обсадную колонну соглашений и сопоставлений строк.
Источник: MSDN CurrentCulture
Примечание. Предыдущий параметр свойства CurrentCulture
, вероятно, является дополнительным, если контроллер уже работает с CultureInfo("en-US")
или аналогичным, если формат даты "MM/dd/yyyy"
.
После настройки свойства CurrentCulture
добавьте блок кода для преобразования даты в формат "M/d/yyyy"
в представлении:
@{ //code block
var shortDateLocalFormat = "";
if (Model.AuditDate.HasValue) {
shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
//alternative way below
//shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
}
}
@shortDateLocalFormat
Над переменной @shortDateLocalFormat
форматируется ToString("M/d/yyyy")
работает. Если используется ToString("MM/dd/yyyy")
, как и в первый раз, то вы в конечном итоге имеете ведущую нулевую проблему. Также, как рекомендовано Томми ToString("d")
, также работает. На самом деле "d"
означает "Short date pattern" и может использоваться с различными форматами культуры/языка.
Я думаю, что блок кода сверху также может быть заменен некоторым классным вспомогательным методом или аналогичным.
Например
@helper DateFormatter(object date)
{
var shortDateLocalFormat = "";
if (date != null) {
shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
}
@shortDateLocalFormat
}
может использоваться с этим вспомогательным вызовом
@DateFormatter(Model.AuditDate)
Обновить, я узнал, что альтернативный способ сделать то же самое, когда DateTime.ToString(String, IFormatProvider). Когда этот метод используется, нет необходимости использовать свойство Thread
s CurrentCulture
. CultureInfo("en-US")
передается как второй аргумент → IFormatProvider в DateTime.ToString(String, IFormatProvider)
метод.
Модифицированный вспомогательный метод:
@helper DateFormatter(object date)
{
var shortDateLocalFormat = "";
if (date != null) {
shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
}
@shortDateLocalFormat
}
.NET Fiddle
Ответ 7
Я использовал это изменение в своем коде:
старый код:
<td>
@Html.DisplayFor(modelItem => item.dataakt)
</td>
new:
<td>
@Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Ответ 8
Вы можете использовать атрибут [DisplayFormat] в своей модели представления, поскольку хотите применить этот формат для всего проекта.
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }
Ответ 9
Возможно попробуйте просто
@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)
также вы можете использовать много типов строкового формата, например
.ToString( "dd MMM, yyyy" )
.ToString( "d" ) и т.д.
Ответ 10
У меня была аналогичная проблема с моим контроллером, и вот что сработало для меня:
model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""
"DateSigned" - это значение из моей модели
Строка читает, если значение модели имеет значение, а затем форматирует значение, иначе ничего не отображается.
Надеюсь, что поможет
Ответ 11
Это лучший способ получить простую строку даты:
@DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
Ответ 12
В представлении заменить это:
@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())
С:
@if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
else {@Html.DisplayFor(Model => Model.AuditDate)}
Объяснение: Если значение AuditDate не равно нулю, то оно будет форматировать дату в dd/MM/yyyy, в противном случае оставьте это как есть, потому что оно не имеет значения.
Ответ 13
Вы можете использовать Convert
<td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td>
Ответ 14
См. этот ответ об ошибке No overload for method 'ToString' takes 1 arguments
.
Вы не можете отформатировать нулевую DateTime - вам нужно использовать свойство DateTime.Value.
@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty
Совет. Всегда полезно работать с этим материалом в стандартном классе с intellisense, прежде чем помещать его в представление. В этом случае вы получите ошибку компиляции, которую легко заметить в классе.