如何删除默认的客户端验证器?

时间:2012-09-20 08:50:13

标签: asp.net-mvc validation

我已根据以下主题中接受的答案实现了下拉日期时间控件和验证器: How to validate a date using 3 dropdowns( day, month, year ) using jquery unobtrusive validation?

我正在使用MVC 4.

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

如果日期设置正确,此消息不会阻止POST表单,但该消息会让用户感到困惑。

当我检查Firebug中不显眼的规则时,我看到此消息来自默认的“日期”规则。我知道我可以使用规则(“删除”(或删除规则,消息)来删除此默认日期规则,但我不确定,何时适当的时候删除它们以阻止MVC再次添加该规则。

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

2 个答案:

答案 0 :(得分:1)

我没试过,但我想ClientDataTypeModelValidatorProvider添加了默认的数据类型客户端验证规则。默认情况下,此提供程序为ON。您可以尝试从Global.asax.cs中的ModelValidatorProvidersCollection中删除它。

  var clientDataTypeProvider = ModelValidatorProviders.Providers.FirstOrDefault(p => p.GetType().Equals(typeof(ClientDataTypeModelValidatorProvider)));
  ModelValidatorProviders.Providers.Remove(clientDataTypeProvider);

注意:删除此功能后,您将失去数字的验证。其他选项是创建自定义ClientDataTypeModelValidatorProvider并将其添加到providers集合中。还有一件事是这个想法在全球范围内起作用并影响到所有其他地方。

答案 1 :(得分:0)

所以我发明了一个快速黑客,也许有人会发现它很有用或者可能有一些改进:

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中测试,“在我的机器上运行”。