如何在MVC中为日期类型字段设置默认初始值
问题根因
你使用[DataType(DataType.Date)]标记后,@Html.EditorFor会将控件渲染为HTML5原生的<input type="date">元素,这类元素要求value属性必须严格遵循yyyy-MM-dd的格式才能被浏览器识别展示。你当前设置的DisplayFormat格式为dd-MMM-yyyy,和原生控件要求的格式不匹配,导致浏览器无法识别初始值,所以显示为空。同时直接传递DateTime对象给Value属性,输出的字符串格式也不符合要求,也会导致赋值失败。
可选用的解决方案
方案1:适配原生HTML5日期控件
如果你需要使用浏览器原生的日期选择功能,调整模型特性和视图赋值逻辑即可:
- 修改模型的
DisplayFormat配置,关闭编辑状态下的自定义格式,避免和原生控件格式冲突:
[DataType(DataType.Date, ErrorMessage = "Date Only")] [DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", ApplyFormatInEditMode = false)] [Display(Name = "Starting Date")] public DateTime StartDate { get; set; } = DateTime.Today.AddDays(-29);
- 视图赋值时将日期转为原生控件要求的格式:
@Html.EditorFor(model => model.StartDate, new { htmlattributes = new { @class = "datepicker", @value = Model.StartDate.ToString("yyyy-MM-dd") } })
方案2:适配第三方日期选择插件
如果你给控件加datepicker类是为了使用jQuery UI等第三方日期选择插件,不需要原生的日期控件,可以直接用TextBoxFor代替EditorFor,避免渲染为type="date"的原生控件,直接输出你需要的格式:
@Html.TextBoxFor(model => model.StartDate, "{0:dd-MMM-yyyy}", new { @class = "datepicker" })
额外注意事项
如果是在POST请求后返回视图,需要确认ModelState中没有残留的StartDate旧值,框架会优先读取ModelState里的值覆盖模型赋值,这种情况可以在返回视图前调用ModelState.Clear(),或者手动更新ModelState["StartDate"].Value的值。
内容的提问来源于stack exchange,提问作者Steve Cross
相关产品推荐
相关产品推荐

