@ Html.DisplayFor - DateFormat («мм / дд / гггг»)

88

У меня есть следующий код бритвы, в котором я хочу иметь 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 аргумент

Ник Кан
источник

Ответы:

161

Если вы используете 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")
}

Однако это применимо ко всем DateTimes, даже к тем, где вы также кодируете время. Если вы хотите применить только на сегодняшний день, только свойства, а затем использовать , 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")
}
Крис Прэтт
источник
Я создал displayTemplate, как вы предложили, и когда я копирую и вставляю код, который у вас есть в шаблоне, я получаю эту ошибкуNo overload for method 'ToString' takes 1 arguments
Ник Кан,
3
Думаю, так и должно быть[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
[DisplayFormat (DataFormatString = "{0: dd / MM / yyyy}")] сработал для Турции, спасибо
zapoo
@Mac: Что ты имеешь в виду? Они очень делают работу, но , возможно , просто не в вашем конкретном случае. Без дополнительной информации я не могу сказать, какова ваша ситуация.
Крис Пратт
Если вы хотите, чтобы редактор использовать формат как хорошо, добавить ApplyFormatInEditMode = trueв собственность: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Это должно быть очевидно, но когда у вас нет времени тратить время на копипаст, этот намек от intellisense может пройти мимо вашего носа, как и мой :)
Хеки
19

Если вы просто выводите значение этого свойства модели, вам не нужен DisplayForпомощник html, просто вызовите его напрямую с правильным форматированием строки .

Audit Date: @Model.AuditDate.Value.ToString("d")

Должен выводить

Audit Date: 1/21/2015

Наконец, ваша дата аудита может быть нулевой, поэтому вам следует выполнить условную проверку, прежде чем пытаться отформатировать значение, допускающее значение NULL.

@if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}

Поиск в Google ошибки, которую вы получаете, дает этот ответ , который показывает, что ошибка связана с использованием слова Model в ваших помощниках Html. Например, используя @Html.DisplayFor(Model=>Model.someProperty). Измените их, чтобы использовать что-то другое, кроме Model, например: @Html.DisplayFor(x=>x.someProperty)или измените заглавную Mбукву на строчную mв этих помощниках.

Томми
источник
если бы я использовал @Model.AuditDate.Value.ToString("d") Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Ник Кан
@AbuHamzah - похоже, вы все еще пытаетесь поместить это в Html.DisplayForпомощник. Не делай этого. Кроме того, уверены ли вы, что это вызывает ошибку в этой строке, а не в каком-то другом свойстве, для которого вы пытаетесь использовать DisplayForпомощник?
Tommy
Если я использовал, @Model...я получаю эту ошибку: «Модель» конфликтует с объявлением System.Web.Mvc.WebViewPage <TModel> .Model »
Ник Кан,
@AbuHamzah Пожалуйста, посмотрите последний абзац в моем обновленном ответе.
Tommy
11

Я использовал это изменение в своем коде:

старый код:

 <td>
  @Html.DisplayFor(modelItem => item.dataakt)
 </td>

новый:

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Петр Мирек
источник
... а также? Это ответ что ли?
Maciej Jureczko
Да, это просто решение проблемы с темы. Я подумал, что это может быть кому-то полезно.
Петр Мирек
Хорошо, я бы посоветовал вам изменить «Я использовал это изменение в своем коде» на что-нибудь, конкретно указывающее, что это решение.
Maciej Jureczko
Простой и удобный ответ, у меня сработало спасибо !!
Сканер
5

Я реализовал подобное так:

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

И ... Готово :)

Акшат
источник
1
Но зачем тебе это делать?
CodeCaster
Потому что ни один из других методов у меня не работал, и это сэкономило мне много кода. Кроме того, конечный результат доступен только для чтения и не имеет рамки, поэтому он не выглядел как текстовое поле.
Акшат
4

Для меня было достаточно использовать

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }
ДмитрийБойко
источник
4

Вы можете использовать атрибут [ DisplayFormat ] в своей модели представления, если хотите применить этот формат для всего проекта.

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }
Аунг Сан Мьинт
источник
2

После некоторых копаний я закончил тем, что установил 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 к 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

Юрким
источник
1

Может попробовать просто

@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)

также вы можете использовать многие типы строковых форматов, например .ToString ("dd MMM, yyyy") .ToString ("d") и т. д.

Wiizl
источник
получение ошибки: «Модель» конфликтует с объявлением «System.Web.Mvc.WebViewPage <TModel> .Model»
Ник Кан,
если бы я использовал @modelэто не узнает
Ник Кан
@AbuHamzah - я ошибся, это заглавная буква Mпри использовании на HTML-странице, нижний регистр mпри объявлении.
Tommy
ошибка по-прежнему появляется, пожалуйста, посмотрите, как я отвечаю на ответ Томми
Ник Кан,
1
No overload for method 'ToString' takes 1 argumentsжалуются, когда я используюToString("mm/dd/yyyy")
Ник Кан
1

В представлении Замените это:

@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 не равно нулю, тогда дата будет отформатирована как дд / ММ / гггг, в противном случае оставьте это как есть, потому что оно не имеет значения.

user2298633
источник
0

У меня была аналогичная проблема на моем контроллере, и вот что сработало для меня:

model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""

«DateSigned» - это значение из моей модели. Строка гласит: если значение модели имеет значение, отформатируйте значение, иначе ничего не покажет.

надеюсь, это поможет

user3170254
источник
0

Это лучший способ получить простую строку даты:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
ахмад судьба
источник
Вот что делает этот ответ: принимает HtmlStringвывод DisplayFor, преобразует его в String, анализирует как, а DateTimeзатем форматирует как String. На мой взгляд, излишне сложный.
Heretic Monkey
0

Вы можете использовать Convert

 <td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td> 
Картик
источник
-1

См. Этот ответ об No overload for method 'ToString' takes 1 argumentsошибке.

Вы не можете форматировать DateTime, допускающее значение NULL - вы должны использовать свойство DateTime.Value.

@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty

Совет: всегда полезно проработать этот материал в стандартном классе с intellisense, прежде чем помещать его в представление. В этом случае вы получите ошибку компиляции, которую легко обнаружить в классе.

НочьСова888
источник
если я использую предложенный код, то получаю эту ошибку'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Ник Кан,