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

272

У меня проблемы с отображением единственной части даты DateTime в текстовое поле с использованием TextBoxFor <,> (expression, 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".

Kronos
источник

Ответы:

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

Затем:

<%=Html.EditorFor(m => m.StartDate) %>
Кевин Крафт
источник
Да, так как теперь есть помощник EditorFor, а MVC2 доработан, ваше решение - верный путь
Kronos
66
Но теперь средство выбора даты Jquery UI не может быть применено к этому вводу, поскольку оно игнорирует атрибуты my @ class = "datepicker", как указано для помощника Html.EditorFor (). Таким образом, это текстовое поле теперь форматируется правильно, но не запускает средство выбора даты при нажатии. Так что одно исправлено, другое сломано.
Аарон
5
Как я могу заставить его отображаться в соответствии с этим решением, но также заставить его запускать средство выбора даты, как это было с Html.TextboxFor ()
Aaron
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. Это недостаток Editorfor. TextBoxFor игнорирует аннотацию DisplayFormat. Решение Алексея применяет формат по-другому, чтобы обойти это.
AaronLS
363

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 - он позволяет мне использовать @Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
средство выбора
3
Спасибо! Но похоже на ошибку, что TextBoxFor игнорирует [DisplayFormat]атрибут модели . Рад, что в TextBoxFor есть хотя бы переопределение (и вы предупредили меня об этом).
Нил Ласлетт
7
Я установил это так, @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")но на httpPost я получаю данные типа MM.dd.yyyy. Как это решить?
user007
3
Я покупаю тебе пиво! Эта небольшая проблема вызывала у меня такую ​​головную боль, пока я не нашел этот ответ.
JoshYates1980
3
К вашему сведению : многие браузеры и 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") })%>
Alexeyss
источник
5
Решение EditorFor работает, за исключением случаев, когда вам нужно переопределить другие атрибуты HTML, такие как id или класс. Это отличное решение. Странно, что V должен быть в верхнем регистре.
Бен Миллс
1
Чтобы безопасно обрабатывать нуль, вы можете сделать Model.EndDate.GetValueOrDefault (). ToString ("dd.MM.yyyy"). Значение по умолчанию Datetime будет отображаться, если Model.EndDate имеет значение null.
15
Что касается нулей, значение DateTime по умолчанию - 1 января 1901 года, на мой взгляд, было бы лучше использовать@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Серж Саган
1
@Spikolynn, для меня это не сгенерировало второй атрибут 'Value' (шаблон MVC3 / бритва).
Дуг С
2
ВАЖНО: Проверьте наличие заглавной буквы «V» в поле «Значение», строчная буква не будет!
Техасви Хегде
48

Или используйте нетипизированные помощники:

<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>
andersjanmyr
источник
22
Небольшая вариация@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Дэн Фридман,
Он использует Razor вместо механизма просмотра ASPX, но оба они работают в MVC 4, и переключение с одного синтаксиса на другой тривиально. Я написал в Razor, потому что это то, что я использовал и протестировал с. Как я уже сказал, это вариация.
Дэн Фридман
1
@ Дэн Фридман: Это был путь для меня! Раньше я работал с шаблоном редактора, но потом мне также пришлось создавать свой собственный 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 })
user5240713
источник
12

Не бойтесь использовать сырой HTML.

<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />
Тамас Чинеге
источник
4
Как он отправит это тогда? Потому что дата почти наверняка не будет проанализирована на сервере.
Роберт Коритник
10
Пока вы включаете правильное 'name = "StartDate"', связыватель модели будет его подбирать.
Naspinski
@DrJokepu единственное, что работает для меня на MVC3. То есть я не смог сделать TextBoxForили EditorForотформатировать значение в любом случае. См. Мой вопрос: TextBox для помощника смешивает день и месяц в датах
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:

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

Свойство Date вашего модельного класса:

public DateTime DOB { get; set; }

На стороне модели больше ничего не нужно.


В Razor вы делаете:

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


Объяснение:

Дата html- inputэлемента типа dateдолжна быть отформатирована в соответствии с ISO8601 , а именно:yyyy-MM-dd

Отображаемая дата форматируется на основе локали браузера пользователя, но проанализированное значение всегда форматируется гггг-мм-дд.

По моему опыту, язык определяется не Accept-Languageзаголовком, а языком отображения браузера или языком системы ОС.

Легенды
источник
4

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

[DataType(DataType.Date)]

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

В конце концов, я пошел с Алексом, потому что в моей нынешней среде нет Modernizr, но если бы он был, я бы использовал его, чтобы условно показать только средство выбора данных, если бы браузер уже не поддерживал его.

AaronLS
источник
3

Для меня, мне нужно было сохранить, TextboxFor()потому что при использовании EditorFor()меняет тип ввода на сегодняшний день. Который в Chrome добавляет встроенный инструмент выбора даты, который испортил jQuery datepicker, который я уже использовал. Итак, чтобы продолжить использовать TextboxFor()AND только для вывода даты, вы можете сделать это:

<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>
ScubaSteve
источник
1

Атрибут DisplayFormat не работал для меня ни в одной форме при начальной загрузке. Вместо этого я создал EditorTemplate:

<%@ 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 - вы получите сообщение об ошибке, в котором говорится, что формат недействителен.

guerven
источник
1

Я использую Globalize, поэтому работаю со многими форматами даты, поэтому используйте следующее:

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

Это автоматически настроит формат даты в соответствии с настройками локали браузера.

Liam
источник
1

Имейте в виду, что показ будет зависеть от культуры. И хотя в большинстве случаев все остальные ответы верны, у меня это не сработало. Проблема с культурой также вызовет различные проблемы с jQuery datepicker, если он прикреплен.

Если вы хотите принудительно изменить формат /следующим образом:

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

Если не сбежал для меня, это шоу 08-01-2010против ожидаемого08/01/2010 .

Также, если не удалось избежать, jQuery datepicker выберет другую defaultDate, в моем случае это было May 10, 2012.

CrnaStena
источник
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

// время отображения даты в DatePicker - 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>

Надеется, что это помогает ..

coymax
источник
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. Если не указано иное, связанные входные данные не будут отображаться должным образом и будут отображаться как мм / дд / гггг без значения.

Модель:

[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

Вы можете использовать приведенный ниже код для печати времени в формате ЧЧ: мм. В моем случае тип свойства - TimeSpan. Таким образом, значение приходит в формате ЧЧ: мм: 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" })
Эон Суен
источник