为什么DateTime编辑器不显示视图模型值



我在编辑和创建视图模型时声明了DateTime属性,如:

[DataType(DataType.Date)]
[Display(Name = "Start")]
public DateTime DateTimeStart { get; set; }

我使用EditorForModel为整个视图模型呈现编辑器,但当我获取要编辑的记录时,视图模型属性会得到正确的值,正如我用DisplayTextFor显示的那样,但MVC呈现的DateTime选择器是空的,当下拉时,会显示今天的日期。为什么这些没有显示预期的日期值?

我不得不在我的模型属性上设置一个额外的数据注释来解决这个问题。

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

我遇到了和你一样的问题。用户仍将在输入字段中看到mm/dd/yyyy格式。这只是在使用内置的HTML EditorFor帮助程序分配数据时对数据进行格式化。

您可以使用DisplayTemplates和EditorTemplates来定义如何显示特定类型的属性。

在Views>Shared文件夹中,创建一个名为DisplayTemplates的文件夹和另一个称为EditorTemplates的文件,然后可以为要显示的每种不同类型的属性添加自定义模板。模板的工作方式类似于分部。

我有一个用于DateTime 的DisplayTemplate

@model DateTime
@if (Model.Value.Year == 1) {
@Html.TextBox("", "") 
} else {
@Html.TextBox("", (Model.Value.ToString("dd/MM/yyyy"))) 
}
<span class="help-text">dd/mm/yyyy</span>   

这是TimeSpan 的编辑器模板

@model TimeSpan
@Html.DropDownList("", Enumerable.Range(0, 30)
.Select(i => new SelectListItem { Value = i.ToString(), 
Text = i.ToString(), Selected = Model.Days == i })) days  
@Html.DropDownList("", Enumerable.Range(0, 24)
.Select(i => new SelectListItem { Value = i.ToString(), 
Text = i.ToString(), Selected = Model.Hours == i })) hours : 
@Html.DropDownList("", Enumerable.Range(0, 60)
.Select(i => new SelectListItem { Value = i.ToString(), 
Text = i.ToString(), Selected = Model.Minutes == i })) minutes : 
@Html.DropDownList("", Enumerable.Range(0, 60)
.Select(i => new SelectListItem { Value = i.ToString(), 
Text = i.ToString(), Selected = Model.Seconds == i })) seconds

我要提醒你,你可以花很多时间尝试让EditorForModel按照你想要的方式工作,但总有一些情况下它工作不太好,你不得不求助于手工编码。

我们现在使用一个HTML助手来将我们的自定义HTML包装在每个属性上——这可以很好地与所描述的自定义模板一起工作,但也允许更大的灵活性。我们使用这个页面作为我们定制HTML包装器的灵感来源。ASP。NET MVC 3自定义HTML帮助程序-最佳实践/使用查看支持票数最高的答案,而不是接受的答案。

这取决于浏览器。到目前为止,只有Opera为您提供HTML5日期输入类型的日期选择器。

最新更新