关于asp.net mvc:仅在@ Html.Editor中显示日期

show only the date in @Html.EditorFor helper

我正在尝试填充@Html.EditorFor助手。 我使用以下属性创建了一个视图模型

1
2
3
[DataType(DataType.Date, ErrorMessage="Date only")]
[DisplayFormat(DataFormatString ="{0:dd/MM/yy}", ApplyFormatInEditMode = true)]
public DateTime? YearBought { get; set; }

我的助手如下所示(a)

1
2
@Html.ValidationMessageFor(m => m.YearBought)
@Html.EditorFor(model => model.YearBought, new { @type ="date" })

我也尝试过(b)

1
2
@Html.ValidationMessageFor(m => m.YearBought)
@Html.EditorFor(model => model.YearBought.Value.Date)

使用上述格式(a)不会显示任何内容。 使用上述格式(b)12/05/2014 00:00:00以文本框格式显示。

我正在尝试实现不显示时间的日期选择器格式

我已经审查了其他几个问题,但看不到我做了什么不同的事情。

当我查看数据库时,该值另存为2014-05-12,当我保存该值时,EditorFor helper生成所需的输入工具

问题复习

第一,第二,第三...

编辑
刚刚在chrome开发工具中打开了控制台,因此此消息

The specified value"12/05/14" does not conform to the required format,"yyyy-MM-dd"

我以为DisplayFormat(DataFormatString ="{0:dd/MM/yy}"正在定义如何显示我的日期?


使用type="date"时需要使用ISO格式

1
2
3
[DataType(DataType.Date, ErrorMessage="Date only")]
[DisplayFormat(DataFormatString ="{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime? YearBought { get; set; }

这将在浏览器区域性中显示日期。

请注意,无需添加@type ="date"EditorFor()方法将由于DataType属性而添加该内容。另请注意,type="date"仅在Chrome中受支持(FireFox和IE只会生成普通文本框)

如果确实要在标准文本框中显示格式dd/MM/yyyy,则可以使用

1
@Html.TextBoxFor(m => m.YearBought,"{0:dd/MM/yyyy}")


正如斯蒂芬的回答中所说,您必须使模型中的标签之间的格式与视图中显示的格式匹配,并且无论您实际想要如何显示,都应为yyyy-MM-dd(ISO)格式日期:

1
2
3
4
5
6
7
8
9
10
11
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

// .... your namespace .... your class....

[DisplayName("Year Bought")]
[DataType(DataType.Date, ErrorMessage="Date only")]
[DisplayFormat(DataFormatString ="{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime? YearBought { get; set; }

他是对的,因为我们有[DataType(DataType.Date)],所以我们在View的HtmlAttributes中不需要@type = date

我的答案与他的不同之处在于,如何将模型中的值实际应用于视图上的控件。由于YearBoughtNullable,因此我们必须使用.Value以某种方式将其值设置为:

1
2
3
@Html.EditorFor(model => model.YearBought,
    new { htmlAttributes = new { @class ="form-control datepicker",
    @Value = Model.YearBought.Value.Date.ToString("yyyy-MM-dd") } })

密切注意设置.ToString("yyyy-MM-dd")。不过,它不会显示在这样的框中-至少对我来说-可能是因为我在计算机上的美国区域设置会接管并将其显示为MM/dd/yyyy。这可能会使一些人困惑,但是最好只是"做"而不用担心。

如果YearBought只是笔直的DateTime而不是DateTime?,则没有.Value

1
2
3
4
@Html.EditorFor(model => model.YearBought,
    new { htmlAttributes = new { @class ="form-control datepicker",
    @Value = Model.YearBought != null ?
    Model.YearBought.Value.Date.ToString("yyyy-MM-dd") : null } })


除了HTML type属性之外,还可以在MVC中使用EditorTemplate来放置为已知的C#数据类型(如DateTime)呈现自定义编辑器所需的标记,CSS和JS。

这是在MVC中创建自定义" EditorTemplate"的演练(尽管不是日期数据类型,但是概念相同)


为了使操作最简单,我将视图模型的YearBought属性设置为String。服务器可以格式化日期,可以在回发时进行解析,并且您仍然可以使用DataType.Date数据注释进行jQuery验证。这也可以确保显示值恰好是提交给视图之前所需的值。