我正在尝试为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?
答案 0 :(得分:6)
让我们先来看看你不使用模板时会发生什么。我添加了泛型类型,使其更加清晰,区别在于什么。
@Html.TextBoxFor<Product>(product => product.StartDate)
现在让我们看看你的模板编辑器:
@Html.TextBoxFor<DateTime?>(dateTime => dateTime)
注意区别?在后一种情况下,您只是处理DateTime实例,这意味着您正在丢失由模型属性定义的元数据。
通过使用模板,您负责处理元数据,该元数据应在ViewData.ModelMetadata.*
中提供给您的模板。例如,在您的情况下,您需要使用ViewData.ModelMetadata.DisplayFormatString
答案 1 :(得分:3)
如果您将编辑器模板更改为:
,则将应用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" })
答案 2 :(得分:0)
更改为@Html.TextBoxFor(m => m, new { @class="datepicker" })