我已根据以下主题中接受的答案实现了下拉日期时间控件和验证器: How to validate a date using 3 dropdowns( day, month, year ) using jquery unobtrusive validation?
我正在使用MVC 4.
这个3下拉日期工作正常,但有时当我点击这三个下拉菜单并选择不同的值(包括“未选择的”值)时,我会收到默认的DateTime验证器的错误消息“字段出生日期必须是日期。”即使我选择了有效的年/月/日期,我的自定义验证器也会通过。
如果日期设置正确,此消息不会阻止POST表单,但该消息会让用户感到困惑。
当我检查Firebug中不显眼的规则时,我看到此消息来自默认的“日期”规则。我知道我可以使用规则(“删除”(或删除规则,消息)来删除此默认日期规则,但我不确定,何时适当的时候删除它们以阻止MVC再次添加该规则。
如何删除此默认“日期”规则,以确保只有我的自定义规则对这三个下拉列表有效?
答案 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中测试,“在我的机器上运行”。