Поле DateTime и вспомогательный Html.TextBoxFor ().Как правильно его использовать? - PullRequest
21 голосов
/ 17 сентября 2010

У меня есть поле 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") , все работает, но поле форматируется с использованием той части времени, которая мне вообще не нужна.

Где я делаю не так? Какой правильный способ справиться с этим?

спасибо за помощь!

EDIT

Это объявление свойства в классе модели

[Required]
[DisplayName("Data Udienza")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime DataUdienza { get; set; }

Ответы [ 5 ]

23 голосов
/ 08 июня 2012

Я использую это в MVC 4. Это также работает ~

@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" })
19 голосов
/ 17 сентября 2010
<%= Html.EditorFor(model => model.DataUdienza) %>

А в вашей модели:

[DisplayFormat(ApplyFormatInEditMode = true, 
               DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DataUdienza { get; set; }

Недостаток EditorFor состоит в том, что вы не можете применять настраиваемые атрибуты HTML к сгенерированному полю. В качестве альтернативы вы можете использовать помощник TextBox:

<%= Html.TextBox("DataUdienza", Model.Date.ToString("dd/MM/yyyy"), new { style = "width: 120px" })%>
12 голосов
/ 17 сентября 2010

Создайте шаблон редактора с именем 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 будет отформатирован без времени.

Это произойдет со всеми датами TimeTime, названными таким образом, хотя ...

ПользовательАтрибуты html можно использовать следующим образом:

<%= Html.EditorFor(model => model.DataUdienza, new {customAttr = "custom", @class = "class"}) %>

Он передается на шаблон Editor в виде ViewData.

2 голосов
/ 26 июля 2012

По крайней мере, если вы используете бритву, вы можете назвать шаблон, так что вам не нужно использовать один и тот же шаблон для всех 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 })
1 голос
/ 10 сентября 2013

Возможно, можно создать метод расширения:

    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?), хотя я не уверен, является ли хорошей идеей компиляция выражения во время выполнения.

...