Поле DateTime и помощник Html.TextBoxFor(). Как правильно использовать его?
У меня есть поле DateTime в моей модели. Если я попытаюсь использовать это поле в строго типизированном частичном представлении таким образом
<%= Html.TextBoxFor(model => model.DataUdienza.ToString("dd/MM/yyyy"), new { style = "width: 120px" }) %>
Я получаю следующую ошибку компиляции во время выполнения
System.InvalidOperationException : Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
В любом случае, если я использую его, удаляя форматирование, ToString ( "dd/MM/yyyy" ), все работает, но поле форматируется с использованием временной части, которая мне вообще не нужна.
Где я делаю неправильно? Каков правильный способ справиться с этим?
спасибо за помощь!
ИЗМЕНИТЬ
Это объявление свойства в классе модели
[Required]
[DisplayName("Data Udienza")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime DataUdienza { get; set; }
Ответы
Ответ 1
Создайте шаблон редактора под названием DateTime.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %>
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToString("MM/dd/yyyy") : string.Empty), ViewData) %>
Поместите его в папку Views/Shared/EditorTemplates. Теперь, когда вы вызываете:
<%= Html.EditorFor(model => model.DataUdienza) %>
Ваше DateTime будет отформатировано без времени.
Это произойдет со всеми указанными тактами DateTimes, хотя...
Пользовательские атрибуты html могут быть использованы следующим образом:
<%= Html.EditorFor(model => model.DataUdienza, new {customAttr = "custom", @class = "class"}) %>
Он переходит к EditorTemplate как ViewData.
Ответ 2
Я использую это в mvc 4. он также работает ~
@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" })
Ответ 3
<%= Html.EditorFor(model => model.DataUdienza) %>
И в вашей модели:
[DisplayFormat(ApplyFormatInEditMode = true,
DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DataUdienza { get; set; }
Недостатком редактора является то, что вы не можете применять пользовательские атрибуты html к сгенерированному полю. В качестве альтернативы вы можете использовать помощник TextBox
:
<%= Html.TextBox("DataUdienza", Model.Date.ToString("dd/MM/yyyy"), new { style = "width: 120px" })%>
Ответ 4
По крайней мере, если вы используете бритву, вы можете назвать шаблон, поэтому вам не нужно использовать тот же шаблон для всех DateTimes:
@Html.EditorFor(m => m.StartDate, "Date")
где Date.cshtml содержит TextBoxFor или какой-либо другой редактор, например @JungleFreak объяснил:
@model DateTime?
@Html.TextBox("", Model.HasValue ? Model.Value.ToShortDateString() : string.Empty,
new { data_datepicker = true })
Ответ 5
Возможно, может быть создан метод расширения:
public static MvcHtmlString DateTimeFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
var compilationResult = expression.Compile();
TValue dateValue = compilationResult((TModel)html.ViewDataContainer.ViewData.Model);
var body = (MemberExpression)expression.Body;
return html.TextBox(body.Member.Name, (Convert.ToDateTime(dateValue)).ToCustomDateFormat(), new { id = body.Member.Name, datepicker = true });
}
метод ToCustomDateFormat может быть методом расширения типов dateTime, который возвращает строковое значение в желаемом формате.
Использование:
@Html.DateTimeFor(x=>x.AnyDateTimeProperty)
Работала отлично для меня (для свойств DateTime
и DateTime?
), хотя я не уверен, что компиляция выражения во время выполнения является хорошей идеей.