Редактор шаблонов не работает с DisplayFormat - PullRequest
8 голосов
/ 19 августа 2011

Я пытаюсь создать шаблон редактора для поля DateTime, и он не соответствует моему атрибуту DisplayFormat.

Моя модель:

public class Project
{
    [Display(Name="Project Name")]
    [Required]
    public string ProjectName { get; set; }

    [Display(Name="Start Date")]
    [DisplayFormat(DataFormatString="{0:M/d/yyyy}", ApplyFormatInEditMode=true)]
    public DateTime? StartDate { get; set; }
}

Шаблон моего редактора в папке /Views/Projects/EditorTemplates/DateTime.cshtml

@model DateTime?
@Html.TextBoxFor(m => Model, new { @class="datepicker" })

Вот вид, который связывает все вместе:

@model Project

<fieldset>
    <legend>Project</legend>

    <div class="editor-label">
        @Html.LabelFor(m => m.ProjectName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(m => m.ProjectName)
        @Html.ValidationMessageFor(m => m.ProjectName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(m => m.StartDate)
    </div>
    <div class="editor-field">
        @Html.EditorFor(m => m.StartDate)
        @Html.ValidationMessageFor(m => m.StartDate)
    </div>
</fieldset>

Когда у меня это так, тогда я вижу временную часть даты. Когда я удаляю шаблон редактора, он работает нормально и показывает только часть даты. Почему кажется, что игнорирует DisplayFormat, когда у меня есть шаблон редактора?

Ответы [ 3 ]

6 голосов
/ 19 августа 2011

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

@Html.TextBoxFor<Product>(product => product.StartDate)

Теперь давайте посмотрим на ваш редактор шаблонов:

@Html.TextBoxFor<DateTime?>(dateTime => dateTime)

Обратите внимание на разницу?В последнем случае вы просто имеете дело с экземпляром DateTime, что означает, что вы теряете метаданные, определенные свойством модели.

Используя шаблон, вы несете ответственность за обработку метаданных, которые должны быть предоставлены вашему шаблону в ViewData.ModelMetadata.*.Например, в вашем случае вам нужно будет отформатировать дату самостоятельно, используя ViewData.ModelMetadata.DisplayFormatString

3 голосов
/ 22 августа 2012

DisplayFormat будет применяться, если вы измените шаблон вашего редактора на:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "datePicker" })

Чтобы сделать ваше свойство даты совместимым с HTML5, добавьте атрибут DataType.Date к свойству модели:

[DataType(DataType.Date)]
[Display(Name="Start Date")]
[DisplayFormat(DataFormatString="{0:M/d/yyyy}", ApplyFormatInEditMode=true)]
public DateTime? StartDate { get; set; }

И добавьте шаблон редактора для даты в /Views/Projects/EditorTemplates/Date.cshtml:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "datePicker", type = "date" })
0 голосов
/ 19 августа 2011

изменить на @Html.TextBoxFor(m => m, new { @class="datepicker" })

...