MVC 5 如何创建固定格式的DateTime可编辑文本框?
解决MVC/Razor中固定格式DateTime编辑器的格式错误问题
这个场景我太熟悉了——用DisplayFormat搞定了显示格式,但编辑时要么格式不对,要么提交后模型绑定报错。下面给你几个实用的解决方案:
方法1:自定义全局DateTime编辑器模板(推荐)
创建一个通用的编辑器模板,以后所有DateTime类型的字段都能复用这个格式,避免重复代码:
- 在你的项目中创建路径:
Views/Shared/EditorTemplates(如果没有就新建文件夹) - 新建
DateTime.cshtml文件,写入以下代码:
@model DateTime? @* 渲染带固定格式的文本框 *@ @Html.TextBox( "", Model.HasValue ? Model.Value.ToString("HH:mm:ss dd/MM/yyyy") : string.Empty, new { @class = "form-control", placeholder = "HH:mm:ss dd/MM/yyyy" } ) @* 保留验证提示 *@ @Html.ValidationMessageFor(m => m)
- 视图里依然用
@Html.EditorFor(m => m.TimeStamp_Start),Razor会自动找到这个模板并应用格式。
方法2:直接在视图中用TextBoxFor指定格式
如果只是个别字段需要特殊处理,直接用TextBoxFor明确指定格式更快捷:
@Html.TextBoxFor( m => m.TimeStamp_Start, "{0:HH:mm:ss dd/MM/yyyy}", new { @class = "form-control" } ) @Html.ValidationMessageFor(m => m.TimeStamp_Start)
这样编辑时输入框会固定显示HH:mm:ss dd/MM/yyyy格式,提交时模型绑定也能正确解析。
方法3:修正DataAnnotations并配合模型绑定优化
先修正你原来的DisplayFormat(注意你之前的格式字符串多了一层嵌套,是笔误):
[DisplayFormat(DataFormatString = "{0:HH:mm:ss dd/MM/yyyy}", ApplyFormatInEditMode = true)] [DataType(DataType.DateTime)] public DateTime TimeStamp_Start { get; set; }
不过要注意:默认的EditorFor可能会渲染HTML5的datetime-local输入控件,它的格式和你指定的可能不兼容(比如浏览器会用yyyy-MM-ddTHH:mm:ss格式)。所以这种方法最好配合前两种一起用,或者在模板里指定type="text"避免使用HTML5日期控件。
为什么会出现编辑格式错误?
默认的DateTime编辑器会优先使用浏览器的区域设置或HTML5原生日期控件,这些控件的格式往往和你自定义的格式不匹配,导致输入后无法正确解析为DateTime类型,从而抛出格式错误。
内容的提问来源于stack exchange,提问作者Thomas VC
相关产品推荐
相关产品推荐

