@ 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

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

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

Погугливши отриману помилку, ви отримаєте цю відповідь , яка показує, що помилка полягає у використанні слова 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помічник?
Томмі

Якщо я використовував, @Model...я отримую цю помилку: "Модель" конфліктує з декларацією System.Web.Mvc.WebViewPage <TModel> .Model '
Нік Кан,

@AbuHamzah Будь ласка, дивіться останній абзац моєї оновленої відповіді.
Томмі

11

Я використовую цю зміну в своєму коді:

старий код:

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

нове:

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>

... і? Це відповідь чи що?
Maciej Jureczko

Так, це просто вирішення проблеми від теми. Я думав, це може комусь бути корисним.
Piotr Mirek

Добре, я б запропонував вам змінити "Я використовував цю зміну в своєму коді" на щось конкретно, зазначивши, що це рішення.
Maciej Jureczko

Проста та зручна відповідь, працювала у мене, дякую !!
Сканер


5

Подібне я реалізував таким чином:

  1. Використовуйте TextBoxFor, щоб відобразити дату в необхідному форматі та зробити поле лише для читання .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. У CSS надайте TextBox нульовий контур і нульову межу .

.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«s 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' 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 Скрипка


1

Може спробувати просто

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

також ви можете використовувати багато типів рядкових форматів, таких як .ToString ("dd MMM, yyyy") .ToString ("d") тощо


отримання помилки: "Модель" конфліктує з декларацією "System.Web.Mvc.WebViewPage <TModel> .Model"
Нік Кан

якщо я використовував, @modelто не впізнає
Нік Кан

@AbuHamzah - я помилився, його велика буква Mпри використанні на HTML-сторінці, мала літера mпри оголошенні.
Томмі

все ще отримуючи помилку, будь ласка, дивіться, я відповідаю на відповідь Томмі
Нік Кан

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 не має значення null, воно відформатує дату в dd / MM / yyyy, інакше залиште її такою, якою вона є, оскільки вона не має значення.


0

У мене була подібна проблема з моїм контролером, і ось що мені вдалося:

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

"DateSigned" - це значення з моєї моделі Рядок читає, якщо значення моделі має значення, відформатуйте значення, інакше нічого не показуйте.

Сподіваюся, це допомагає


0

Це найкращий спосіб отримати простий рядок дати:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()

Ось що робить ця відповідь: приймає HtmlStringвихідні дані DisplayFor, перетворює їх на a String, аналізує як a DateTime, а потім форматує це як a String. На мій погляд, зайво складний.
Єретична мавпа

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, яке можна опустити - потрібно використовувати властивість DateTime.Value

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

Порада: Завжди корисно опрацювати ці речі в стандартному класі з intellisense перед тим, як викласти їх у подання. У цьому випадку ви отримаєте помилку компіляції, яку було б легко помітити в класі.


якщо я використовую запропонований код, тоді з’являється ця помилка'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Нік Кан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.