@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; }

Я реализовал аналогичную вещь следующим образом:

  1. Используйте 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
}

.NET Fiddle

Может быть, попробуйте просто

@(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 перед тем, как поместить его в представление. В этом случае вы получите ошибку компиляции, которую легко обнаружить в классе.

Другие вопросы по тегам