在我的ASP MVC 5 Web应用程序中,我需要以特定格式显示日期。页面加载时,文本格式正确。但是,如果您编辑该值或只是尝试发布,则会显示验证错误:
该字段的定义如下:
@*Creation*@
<div class="form-group">
@Html.LabelFor(model => model.Creation, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.Creation, "{0:dd/MM/yyyy}", new { @class = "form-control"})
@Html.ValidationMessageFor(m => m.Creation)
</div>
</div>
viewmodel属性定义为:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
[Display(Name = "Creation", ResourceType = typeof(Resources.Resources))]
public DateTime Creation { get; set; }
截图是使用Firefox浏览器创建的。如果我在Edge上执行相同的操作,则验证会通过,但此方法在post方法上的绑定无效(默认日期值)。
如何解决此问题?
答案 0 :(得分:8)
这里的问题是,在幕后,验证实际上是由jQuery执行的。所以关键是告诉 jQuery验证器您将使用 dd / MM / yyyy 格式。
有几种方法可以做到这一点。最简单的方法是使用simpe tweak覆盖验证器函数(对于日期):
jQuery(function ($) {
$.validator.addMethod('date',
function (value, element) {
$.culture = Globalize.culture("en-AU");
var date = Globalize.parseDate(value, "dd/MM/yyyy", "en-AU");
return this.optional(element) ||
!/Invalid|NaN/.test(new Date(date).toString());
});
});
另一种方法是将全球化库用于jQuery。您可以使用here全球化图书馆。
当您拥有库时,请包含以下文件:
globalize.js
globalize.culture.en-AU.js
然后覆盖验证器功能:
<script type="text/javascript">
$(function () {
$.validator.methods.date = function (value, element) {
Globalize.culture("en-AU"); // the UK format
return this.optional(element) || Globalize.parseDate(value) !== null;
}
});
</script>