为什么DateTime编辑器没有显示视图模型值?

时间:2012-11-28 10:34:36

标签: asp.net-mvc asp.net-mvc-4

我在编辑中声明了一个DateTime属性,并创建了视图模型,如:

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

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

3 个答案:

答案 0 :(得分:0)

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

在视图中>共享文件夹创建一个名为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的EditorTemplate

@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 Custom HTML Helpers- Best Practices/Uses查看最高票数而非接受答案的答案。

答案 1 :(得分:0)

它取决于浏览器。截至目前,只有Opera为HTML5日期输入类型提供了一个日期选择器。

答案 2 :(得分:0)

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

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

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