0

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

我正在使用 MVC 4。

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

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

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

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

4

2 回答 2

1

我没有尝试过,但我猜默认数据类型客户端验证规则是由ClientDataTypeModelValidatorProvider. 此提供程序默认为 ON。您可以尝试从ModelValidatorProvidersCollectionGlobal.asax.cs 中删除它。

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

注意:通过删除它,您也将失去对数字的验证。其他选项是创建一个自定义ClientDataTypeModelValidatorProvider并将其添加到提供程序集合中。还有一件事是这个想法在全球范围内有效,并影响到所有其他地方。

于 2012-09-20T14:25:12.467 回答
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');
});

加载页面时,它会遍历所有表单并找到应该删除验证器的元素。在我的情况下,我正在从所有具有我的自定义tripledlddate 验证器的下拉列表中删除默认日期验证器。

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

于 2012-09-20T09:59:58.243 回答