Дата тільки з TextBoxFor ()


271

У мене виникають проблеми із відображенням єдиної частини дати DateTime у текстовому полі за допомогою TextBoxFor <,> (вираз, htmlAttributes).

Модель заснована на Linq2SQL, поле - DateTime для SQL та в моделі Entity.

Помилка:

<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>

Цей трюк здається знеціненим, будь-яке значення рядка в об’єкті htmlAttribute ігнорується.

Помилка:

[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }

Я хотів би зберігати та відображати лише детальну дату в деталях / редагуванні, без частини "00:00:00".

Відповіді:


237
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }

Тоді:

<%=Html.EditorFor(m => m.StartDate) %>

Так, оскільки зараз є помічник EditorFor, і MVC2 доопрацьований, ваше рішення - це шлях
Кронос

66
Але тепер до цього вводу не можна застосувати програму інтерфейсу Jquery UI, оскільки він ігнорує мої атрибути @ class = "datepicker", визначені помічником Html.EditorFor (). Отже, це текстове поле тепер форматується правильно, але не запускає панель вибору дати при натисканні. Так його фіксували одне, а інше зламали.
Аарон

5
Як я можу змусити його відображатись у відповідності з цим рішенням, а також змусити його запустити панель вибору дат, як це було зроблено з Html.TextboxFor ()
Аарон,

49
Я використовую синтаксис MVC4 Razor, поле дати відображається як @Html.EditorFor(m => m.IssueDate)і форматування в моделі застосовується як, [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]але дата все ще відображається як01/01/0001 12:00:00 AM
bjan

4
@Aaron Немає перевантаження EditorFor, який має параметр htmlAttributes. Ви, ймовірно, передаєте його в параметр viewTemplate або щось подібне, думаючи, що ви передаєте htmlAttributes. Це недолік редактора. TextBoxFor ігнорує анотацію DisplayFormat. Рішення Alexeyss застосовує формат по-різному, щоб обійти це.
AaronLS

362

MVC4 вирішив цю проблему, додавши нову TextBoxForперевантаження, яка приймає параметр формату рядка. Тепер ви можете просто зробити це:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")

Існує також перевантаження, яка приймає HTML-атрибути, тож ви можете встановити клас CSS, підключити підбірники дат тощо

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })

40
Це найкраща відповідь для MVC4 - він дозволяє мені використовувати jquery інтерфейс дати інтерфейсу та форматувати вибір, роблячи це так:@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
ericb

3
Дякую! Але схоже на помилку, що TextBoxFor ігнорує [DisplayFormat]атрибут моделі . Радий, що в TextBoxFor є принаймні переоцінка (і ви мене про це попередили).
Ніл Ласлетт

7
Я встановив це так, @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")але на httpPost я отримую такі дані, як MM.dd.yyyy. Як це вирішити?
user007

3
Я купую тобі пиво! Це невелике питання викликало у мене такий головний біль, поки я не знайшов цієї відповіді.
JoshYates1980

3
FYI : Для багатьох браузерів та input[type=date]специфікацій потрібен "{0:yyyy-MM-dd}"формат.
KyleMit

259
<%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>

5
Рішення EditorFor працює, за винятком випадків, коли вам потрібно змінити інші атрибути HTML, такі як id або клас. Це чудове рішення. Дивно, що V має бути великим регістром.
Бен Міллз

1
Щоб безпечно працювати з null, ви можете зробити Model.EndDate.GetValueOrDefault (). ToString ("dd.MM.yyyy"). Значення Datetime за замовчуванням відображатиметься, якщо Model.EndDate є нульовим.

15
Щодо нулів, значення за замовчуванням DateTime - 1 січня 1901 року, на мій погляд, було б краще використовувати@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj Sagan

1
@Spikolynn, це не створило для мене другого атрибута "Значення" (MVC3 / шаблон бритви).
Doug S

2
ВАЖЛИВО: Перевірте величину "V" у "Значенні", малою літерою нічого робити!
Tejasvi Hegde

48

Або використовуйте нетипізовані помічники:

<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>

22
Незначна варіація@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Ден Фрідман

Він використовує Razor замість двигуна перегляду ASPX, але вони обидва працюють у MVC 4 і перехід від одного синтаксису до іншого є тривіальним. Я розмістив повідомлення в Razor тому, що я використовував і тестував. Як я вже казав, це варіація.
Ден Фрідман

1
@Dan Friedman: Це був шлях для мене! Раніше я працював із шаблоном редактора, але тоді мені також довелося створити власний html, а також включити всі повідомлення про валідацію І всі атрибути Bootstrap, тож це справді шлях для мене (asp.net mvc5)
Мішель

1
Чи можете ви створити нову проблему та детально пояснити, що ви зробили. Позначте мене, і я з радістю допоможу.
Ден Фрідман

1
Це рішення є найкращим, коли потрібна глобалізація.
alansiqueira27

26

Це працювало для мене.

@Html.TextBoxFor(m => m.DateOfBirth, "{0:MM/dd/yyyy}", new { size = "12", @class = "DOB", tabindex = 121 })

12

Не бійтеся використовувати сирий HTML.

<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />

4
Як він тоді його опублікував? Тому що дати майже напевно не будуть проаналізовані на сервері.
Роберт Коритник

10
Поки ви додасте власне 'name = "StartDate"', палітурка моделі підбере її.
naspinski

@DrJokepu єдине, що працює для мене на MVC3. Тобто я не зміг зробити TextBoxForабо EditorForвідформатувати значення так чи інакше. Дивіться моє запитання: TextBoxFor помічників змішує день і місяць у датах
horgh,

10

TL; DR;

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")

Подавати заявку [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]мені не вийшло!


Пояснення:

Щоб відобразити властивість дати вашої моделі за допомогою Html.TextBoxFor:

введіть тут опис зображення

Властивість дати вашого модельного класу:

public DateTime DOB { get; set; }

Нічого іншого не потрібно з боку моделі.


У Razor ви робите:

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")


Пояснення:

Дата типу inputелемента html dateповинна бути відформатована стосовно ISO8601 , який є:yyyy-MM-dd

Відображена дата відформатована на основі мови браузера користувача, але проаналізоване значення завжди відформатоване yyyy-mm-dd.

Мій досвід полягає в тому, що мова визначається не Accept-Languageзаголовком, а або мовою відображення браузера або системною мовою ОС.


4

Ви також можете використовувати атрибути HTML 5, застосувавши цю примітку до даних:

[DataType(DataType.Date)]

Але проблема полягає в тому, що це дозволяє вибирати дату для браузерів HTML 5, залежно від браузера. Вам все ще потрібен власний інструмент вибору дати для браузерів без підтримки, і тоді ви повинні переконатися, що ваш інструмент вибору дати не відображається окрім браузера (Modernizr може це зробити легко), або приховати браузер, якщо він є (складне і я не знаю, якими надійними методами я бачив).

Врешті-решт я пішов з Alex, тому що в моєму поточному середовищі немає Modernizr, але якби це було, я би використав це, щоб умовно показати лише мій інструмент для вибору даних, якщо браузер уже не підтримував його.


3

Для мене мені потрібно було зберегти, TextboxFor()оскільки використання EditorFor()змін типу введення на сьогоднішній день. Який у Chrome додає вбудований інструмент вибору дат, який накрутив jQuery дата-вибір, який я вже використовував. Отже, щоб продовжити використовувати TextboxFor()І тільки вивести дату, ви можете зробити це:

<tr>
    <td class="Label">@Html.LabelFor(model => model.DeliveryDate)</td>
    @{
        string deliveryDate = Model.DeliveryDate.ToShortDateString();
    }
    <td>@Html.TextBoxFor(model => model.DeliveryDate, new { @Value = deliveryDate }) *</td>
    <td style="color: red;">@Html.ValidationMessageFor(model => model.DeliveryDate)</td>
</tr>

1

Атрибут DisplayFormat не працював для мене ні в одній формі при початковому завантаженні. Натомість я створив шаблон редактора:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%@ Import Namespace="System.Web.Mvc.Html" %>
<%=
    Html.TextBox("", Model.ToShortDateString(), new { @class = "date-range" }) %>

1

Редактор шаблонів працюватиме лише для відображення. Якщо ви використовуєте той самий редактор (що має сенс, оскільки його редактор), і ви ввели таке значення, як 31/01/2010 - ви отримаєте повідомлення про помилку, у якому сказано, що формат недійсний.


1

Я використовую Globalize, тому працюю з багатьма форматами дат, тому використовую наступне:

@Html.TextBoxFor(m => m.DateOfBirth, "{0:d}")

Це автоматично налаштує формат дати відповідно до налаштувань мови локального веб-переглядача.


1

Майте на увазі, що показ буде залежати від культури. І хоча в більшості випадків всі інші відповіді правильні, це не спрацювало для мене. Проблема з культурою також спричинить різні проблеми з jQuery datepicker, якщо вона додається.

Якщо ви хочете змусити вимкнути формат /таким чином:

@Html.TextBoxFor(model => model.dtArrivalDate, "{0:MM\\/dd\\/yyyy}")

Якщо не врятувались для мене, це шоу 08-01-2010проти очікуваного 08/01/2010.

Крім того, якщо jQuery datepicker не вибрав, буде вибрано інше defaultDate, в моєму випадку це було May 10, 2012.


1

Якщо ви використовуєте інструмент вибору дати Bootstrap, ви можете просто додати атрибут data_date_format, як показано нижче.

      @Html.TextBoxFor(m => m.StartDate, new { 
@id = "your-id", @class = "datepicker form-control input-datepicker", placeholder = "dd/mm/yyyy", data_date_format = "dd/mm/yyyy" 
})

0

// Показує датimeimeime в датіPicker є 24.11.2011 12:00:00

// Ви можете розділити це на пробіл і встановити значення лише на дату

Сценарій:

    if ($("#StartDate").val() != '') {
        var arrDate = $('#StartDate').val().split(" ");
        $('#StartDate').val(arrDate[0]);
    }

Розмітка:

    <div class="editor-field">
        @Html.LabelFor(model => model.StartDate, "Start Date")
        @Html.TextBoxFor(model => model.StartDate, new { @class = "date-picker-needed" })
    </div>

Сподіваємось, що це допомагає ..


7
Ваше рішення має спрацювати. Але, на мою скромну думку, покладатися на сторону клієнта може бути небезпечно на форматованій строковій даті, виданій на стороні сервера. Якщо регіональні параметри на стороні сервера не містять проміжку між датою та часом, ваше відкрите рішення не вдасться.
Кронос

0

Звичайно, ви можете використовувати Html.EditorFor. Але якщо ви хочете використовувати TextBoxFor і використовувати формат з атрибуту DisplayFormat, ви можете використовувати його таким чином:

@Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)

або створити наступне розширення:

public static class HtmlExtensions
{
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
    }
}

0

Просто додайте поруч зі своєю моделлю.

[DataType(DataType.Date)]
public string dtArrivalDate { get; set; }

0

Під час використання помічників тегів у ASP.NET Core потрібний формат, визначений у форматі ISO. Якщо не вказано як таке, зв'язані вхідні дані не відображатимуться належним чином і відображатимуться як mm / dd / yyyy без значення.

Модель:

[Display(Name = "Hire")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? HireDate { get; set; }

Вид:

<input asp-for="Entity.HireDate" class="form-control" />

Формат також може бути визначений у представленні, використовуючи атрибут asp-format.

Отриманий HTML виглядатиме так:

<input class="form-control" type="date" id="Entity_HireDate" 
    name="Entity.HireDate" value="2012-01-01">

0

Ви можете використовувати код нижче для друку часу у форматі HH: мм , у моєму випадку Тип властивості - TimeSpan . Значення надходить у форматі HH: mm: tt, але я повинен показувати у вищезгаданому форматі, тобто. HH: мм

Отже, ви можете використовувати цей код:

@Html.TextBoxFor(x =>x.mTimeFrom, null, new {@Value =Model.mTimeFrom.ToString().Substring(0,5), @class = "form-control success" })

0

Якщо ви наполягаєте на використанні [DisplayFormat], але ви не використовуєте MVC4, ви можете скористатися цим:

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.