@Html.DisplayFor - DateFormat ( "mm/dd/yyyy" ) - программирование
Подтвердить что ты не робот

@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 аргумент

4b9b3361

Ответ 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 в этих помощниках.

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