Ответ 1
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }
Тогда:
<%=Html.EditorFor(m => m.StartDate) %>
У меня возникли проблемы с отображением единственной даты DateTime в текстовое поле с использованием TextBoxFor <, > (expression, htmlAttributes).
Модель основана на Linq2SQL, поле - DateTime на SQL и в модели Entity.
Failed:
<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>
Этот трюк кажется обесцененным, любое строковое значение в объекте htmlAttribute игнорируется.
Failed:
[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }
Я хотел бы сохранить и отобразить только часть даты на странице сведений/редактирования без части "00:00:00".
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }
Тогда:
<%=Html.EditorFor(m => m.StartDate) %>
MVC4 решил эту проблему, добавив новую перегрузку TextBoxFor
, которая принимает параметр строкового формата. Теперь вы можете просто сделать это:
@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")
Также существует перегрузка, которая принимает атрибуты html, поэтому вы можете установить класс CSS, подключить datepickers и т.д.:
@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })
<%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>
Или используйте нетипизированные помощники:
<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>
Это сработало для меня.
@Html.TextBoxFor(m => m.DateOfBirth, "{0:MM/dd/yyyy}", new { size = "12", @class = "DOB", tabindex = 121 })
Не бойтесь использования необработанного HTML.
<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />
Вы также можете использовать атрибуты HTML 5, применяя аннотацию этих данных:
[DataType(DataType.Date)]
Но проблема заключается в том, что это позволяет выбрать браузер для браузера HTML 5 для браузера. Вам по-прежнему нужен собственный выбор даты для браузеров без поддержки, а затем вы должны убедиться, что ваш сборщик дат не появляется в дополнение к браузеру (Modernizr может сделать это легко) или скрыть браузер, если это произойдет (сложный и я не знаю, насколько надежными были методы, которые я видел).
В конце концов я пошел с Алексом, потому что в моей нынешней среде не было Modernizr, но если бы это было так, я бы использовал это, чтобы условно показать только мой сборщик данных, если браузер не поддерживает его уже.
Для меня мне нужно сохранить TextboxFor()
, потому что использование EditorFor()
изменяет тип ввода на дату. Что, в Chrome, добавляет встроенный сборщик дат, который прикрутил jQuery datepicker, который я уже использовал. Итак, для продолжения использования 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>
Атрибут 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" }) %>
Редактор шаблонов будет работать только для отображения. Если вы используете тот же редактор (что имеет смысл, потому что его редактор), и вы указали значение, подобное 31/01/2010, вы получите сообщение об ошибке, указывающее, что формат недействителен.
Имейте в виду, что отображение будет зависеть от культуры. И хотя в большинстве случаев все остальные ответы верны, это не сработало для меня. Проблема с культурой также будет вызывать различные проблемы с jQuery datepicker, если она прикреплена.
Если вы хотите принудительно форматировать escape /
следующим образом:
@Html.TextBoxFor(model => model.dtArrivalDate, "{0:MM\\/dd\\/yyyy}")
Если мне не удалось убедится, он показывает 08-01-2010
против ожидаемого 08/01/2010
.
Также, если не экранированный jQuery datepicker будет выбирать другой defaultDate, в моем экземпляре это было May 10, 2012
.
//Отображение даты и времени в datePicker - 11/24/2011 12:00:00 AM
//вы можете разбить это по пробелу и установить значение только на дату
Script:
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>
Надеюсь, это поможет.
Конечно, вы можете использовать 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);
}
}
Просто добавьте рядом с вашей моделью.
[DataType(DataType.Date)]
public string dtArrivalDate { get; set; }
При использовании тегов-помощников в 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">
Я использую Globalize так, чтобы работать со многими форматами дат, поэтому используйте следующее:
@Html.TextBoxFor(m => m.DateOfBirth, "{0:d}")
Это автоматически изменит формат даты на настройки локали браузера.
Если вы используете Bootstrap date picker, вы можете просто добавить атрибут 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"
})