Asp.net mvc 如何删除默认客户端验证程序?

Asp.net mvc 如何删除默认客户端验证程序?,asp.net-mvc,validation,Asp.net Mvc,Validation,我已经基于以下主题中接受的答案实现了下拉DateTime控件和验证器: 我正在使用MVC4 这个3个下拉日期基本上可以正常工作,但有时当我单击这三个下拉列表并选择不同的值(包括“未选择的”值)时,我会收到来自默认日期时间验证器的错误消息“字段出生日期必须是日期”。即使我选择了有效的年/月/日期,并且我的自定义验证器通过 当日期设置正确时,此消息不会阻止发布表单,但该消息会让用户感到困惑 当我检查Firebug中的不引人注目的规则时,我看到这个消息来自默认的“日期”规则。我知道我可以使用规则(“

我已经基于以下主题中接受的答案实现了下拉DateTime控件和验证器:

我正在使用MVC4

这个3个下拉日期基本上可以正常工作,但有时当我单击这三个下拉列表并选择不同的值(包括“未选择的”值)时,我会收到来自默认日期时间验证器的错误消息“字段出生日期必须是日期”。即使我选择了有效的年/月/日期,并且我的自定义验证器通过

当日期设置正确时,此消息不会阻止发布表单,但该消息会让用户感到困惑

当我检查Firebug中的不引人注目的规则时,我看到这个消息来自默认的“日期”规则。我知道我可以使用规则(“删除”(或删除规则、消息)来删除此默认日期规则,但我不确定何时是适当的时间删除它们以停止MVC再次添加该规则


如何删除此默认的“日期”规则,以确保只有我的自定义规则对这三个下拉列表有效?

因此我发明了一种快速破解方法,也许有人会发现它很有用,或者可能需要改进:

function removeDefaultDateValidators(selector, validatorToRemove) {
    $('form').each(function () {
        var settings = $(this).validate().settings;
        $(selector, this).each(function () {
            // rules and messages seem to be keyed by element name, not id
            var elmName = $(this).attr('name');
            delete settings.rules[elmName][validatorToRemove];
            delete settings.messages[elmName][validatorToRemove];
        });
    });
}

$(function () {
    removeDefaultDateValidators('select[data-val-trippleddldate]', 'date');
});
当页面加载时,它会遍历所有表单,并找到应该删除验证程序的元素。在我的例子中,我正在删除默认日期验证程序表单中所有包含自定义trippleddldate验证程序的下拉列表


在Firefox和IE 9中测试,“在我的机器上工作”。

我还没有尝试过,但我猜默认的数据类型客户端验证规则是由
ClientDataTypeModelValidatorProvider
添加的。默认情况下,此提供程序处于启用状态。您可以尝试从Global.asax.cs中的
ModelValidatorProvidersCollection
中删除它

  var clientDataTypeProvider = ModelValidatorProviders.Providers.FirstOrDefault(p => p.GetType().Equals(typeof(ClientDataTypeModelValidatorProvider)));
  ModelValidatorProviders.Providers.Remove(clientDataTypeProvider);
注意:如果删除此选项,您也将丢失对编号的验证。其他选项是创建自定义的
ClientDataTypeModelValidatorProvider
,并将其添加到providers集合中。还有一点是,此想法在全局级别起作用,并影响所有其他地方