在我的模型上使用[DataType(DataType.Date)]时 - 如果它填充了一个值,并且我让“现代”浏览器使用其内置日历显示它,它将永远不会填充日期。< / p>
public class StockPurchase
{
public int StockPurchaseId { get; set; }
[Required]
[Display(Name = "Date of purchase")]
[DataType(DataType.Date)]
public DateTime Date { get; set; }
[Required]
public decimal Amount { get; set; }
}
这是一个已知问题(我正在使用Chrome)。
谢谢,Mark
答案 0 :(得分:4)
这本身并不是一个“已知问题”,只是HTML5日期控制如何工作的问题。日期输入预计采用ISO 8601格式,日期为YYYY-MM-DD
。您看,dd/mm/yyyy
的格式已本地化,以便用户更容易输入日期,但一旦选定,浏览器就会设置ISO 8601中的值。
问题是ASP.NET MVC没有在ISO 8601中设置值,而是在系统本地化版本中设置,然后浏览器无法理解。解决方案是强制MVC通过将以下属性添加到日期属性来设置正确的值:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
然后将使用正确的ISO 8601格式化日期将该字段的值设置为渲染,浏览器将理解它。
注意:这是在视图中直接使用视图模型而不是实体的另一个原因。更有可能的是,您实际上并不希望您的购买日期始终显示为YYYY-MM-DD
。如果为此使用特定于创建/编辑的视图模型,则可以在该属性上设置上述属性,然后在实际实体的属性上设置更合适的版本,或者在特定于显示已输入信息的视图模型上设置用户。