You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kendo中验证dd/MM/yyyy格式日期 解决MVC表单提交报错问题

根本原因

你的问题本质是服务端模型绑定、客户端默认jQuery校验都默认使用MM/dd/yyyy的日期解析规则,当日期第一位(dd)大于12时会被判定为无效月份,所以校验失败。


解决方案

步骤1:配置服务端区域文化,适配dd/MM/yyyy格式

修改项目根目录的Web.config,在<system.web>节点下添加globalization配置,指定使用日/月/年格式的区域文化:

<system.web>
  <!-- 其他原有配置 -->
  <globalization culture="en-GB" uiCulture="en-GB" />
</system.web>

如果需要自定义日期解析规则,也可以单独注册DateTime类型的模型绑定器,在Global.asax的Application_Start方法中添加如下代码:

ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder
{
    SuppressDefaultModelBindingErrors = false,
    DateTimeFormats = new[] { "dd/MM/yyyy HH:mm tt", "dd/MM/yyyy" }
});

步骤2:重写客户端jQuery验证的日期校验规则

默认jQuery Validate的日期校验方法使用MM/dd/yyyy规则,需要重写为适配你的格式的逻辑,直接用Kendo自带的日期解析方法更稳妥:

// 放在所有JS引入完成后、表单初始化之前执行
$.validator.methods.date = function (value, element) {
    if (!value) return true;
    // 按你指定的格式解析日期
    var parsedDate = kendo.parseDate(value, ["dd/MM/yyyy HH:mm tt", "dd/MM/yyyy"]);
    return this.optional(element) || parsedDate !== null;
};

步骤3:修复Kendo组件重复初始化的问题

你已经用Razor语法Html.Kendo().DateTimePickerFor初始化了日期组件,后面JS中再次调用$("#StartDateTime").kendoDateTimePicker()会导致组件配置冲突,直接绑定change事件即可:

$(document).ready(function () {
    function onChange() {
        var startPicker = $("#StartDateTime").data("kendoDateTimePicker");
        var startDate = startPicker.value();
        if (!startDate) return;
        var expDate = new Date(startDate);
        expDate.setHours(expDate.getHours() + 1);
        $("#ExpirationDateTime").data("kendoDateTimePicker").value(expDate);    
    }
    // 直接给已初始化的组件绑定change事件
    $("#StartDateTime").data("kendoDateTimePicker").bind("change", onChange);
});

步骤4(可选):给模型补充格式配置

在模型属性上添加DisplayFormat特性,确保服务端渲染时格式统一:

[Required(ErrorMessage = "Start Datetime is required.")]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm tt}", ApplyFormatInEditMode = true)]
public DateTime StartDateTime { get; set; }

[Required(ErrorMessage = "Expiration Datetime is required.")]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm tt}", ApplyFormatInEditMode = true)]
public DateTime ExpirationDateTime { get; set; }

做完以上配置后,dd/MM/yyyy格式的日期就可以正常通过前后端校验。


内容的提问来源于stack exchange,提问作者AJ31

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:45:06