@Html.DisplayFor - DateFormat ("мм / дд / гггг")
У меня есть следующий код бритвы, который я хочу иметь mm/dd/yyyy
Формат даты:
Audit Date: @Html.DisplayFor(Model => Model.AuditDate)
Я пробовал несколько разных подходов, но ни один из этих подходов не работает в моей ситуации
моя AuditDate является DateTime?
тип
Я пробовал что-то вроде этого и получил эту ошибку:
@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())
Дополнительная информация: Шаблоны могут использоваться только с доступом к полю, доступом к свойству, индексом одномерного массива или выражениями настраиваемого индексатора с одним параметром.
Пробовал это:
@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))
Никакая перегрузка для метода 'ToString' не принимает 1 аргумент
17 ответов
Если вы используете 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
Тем не менее, даже те, где вы кодируете время. Если вы хотите, чтобы он применялся только к свойствам только для даты, используйте 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")
}
Я использовал это изменение в моем коде:
старый код:
<td>
@Html.DisplayFor(modelItem => item.dataakt)
</td>
новый:
<td>
@Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Если вы просто выводите значение этого свойства модели, вам не нужно DisplayFor
HTML помощник, просто вызовите его с правильным форматированием строки.
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
в этих помощниках.
Вы можете использовать атрибут [DisplayFormat] в своей модели представления, если хотите применить этот формат для всего проекта.
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }
@ChrisPratt неверно ответил об использовании шаблона отображения. Правильный код для работы:
@model DateTime?
@if (Model.HasValue)
{
@Convert.ToDateTime(Model).ToString("MM/dd/yyyy")
}
Это потому что .ToString()
за Nullable<DateTime>
не принимает Format
параметр.
Для меня было достаточно использовать
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }
Я реализовал аналогичную вещь следующим образом:
- Используйте 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;
}
И...... Это сделано:)
Вы можете использовать Convert
<td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td>
В представлении заменить это:
@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, в противном случае оставьте это как есть, потому что оно не имеет значения.
Вместо
@Html.DisplayFor(Model => Model.AuditDate)
Использовать
@Model.AuditDate.ToString("MM/dd/yyyy")
Этот стиль отображает дату как:
06/02/2022
.
Вы можете стилизовать свою строку в соответствии с тем, как вам это нужно.
Это лучший способ получить простую строку даты:
@DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
После некоторых копаний и настройки 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"
расшифровывается как "Шаблон короткой даты" и может использоваться с различными форматами культуры / языка.
Я предполагаю, что блок кода сверху также может быть заменен каким-нибудь классным вспомогательным методом или подобным.
Например
@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 to 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
}
Может быть, попробуйте просто
@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)
также вы можете использовать много типов форматов строк, таких как.ToString("dd MMM, yyyy") .ToString("d") и т. д.
Вам просто нужно установить аннотацию данных в вашей модели.
[DisplayFormat(ApplyFormatInEditMode = true,DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime AuditDate {get; set;}
При просмотре (страница cshtml)
@Html.DisplayFor(model => model.AuditDate)
Вам больше ничего не нужно делать. Надеюсь, это полезно.
Вы можете использовать это вместо использования
@html.DisplayFor()
.
@Convert.ToString(string.Format("{0:dd/MM/yyyy}", Model.AuditDate))
У меня была похожая проблема на моем контроллере, и вот что сработало для меня:
model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""
"DateSigned" - это значение из моей модели. Строка гласит: если значение модели имеет значение, отформатируйте значение, в противном случае ничего не отображается.
надеюсь, это поможет
Смотрите этот ответ о No overload for method 'ToString' takes 1 arguments
ошибка.
Вы не можете отформатировать обнуляемый DateTime - вы должны использовать свойство DateTime.Value.
@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty
Совет: всегда полезно разобраться с этим в стандартном классе с помощью intellisense перед тем, как поместить его в представление. В этом случае вы получите ошибку компиляции, которую легко обнаружить в классе.