我正在尝试在我们自己的查找控件上实现IsRequired
属性(实际上是一个包含Ajax AutoCompleteExtender
和一个CustomValidator
的包装器)。如您所知,对查找控件实现正确的验证不仅涉及检查控件是否为空,该条目必须实际存在于查找预测列表中。
我正在使用以下ClientValidationFunction
连接到CustomValidator
:
function ValidateLookup(sender, args) {
var isValidEntry = $("#" + sender.controltovalidate)
.parent()
.children()
.filter("input:first")
.attr('ValidEntry') == args.Value;
if (isValidEntry)
args.IsValid = true;
else {
var acEntries = $("#" + sender.controltovalidate)
.parent()
.find("li[innerText=" + args.Value + "]");
args.IsValid = acEntries.length > 0;
if (args.IsValid)
$("#" + sender.controltovalidate)
.parent()
.children()
.filter("input:first")
.attr('ValidEntry', args.Value);
}
}
我正在利用AutoCompleteExtender呈现来检查条目的方式,我知道你的条目有一个文本框,隐藏了最后一个选定的值(在验证通过之前不会填充)和一个无序列表(ul )保存查找预测。
现在这个有效,但我不知道是否有人知道如何让它看起来不像黑客。当前的问题是,只有在控件调用验证时才会对当前条目与预测列表进行验证(因为ul已填充并且在自动完成框下方可用/浮动)。当页面调用验证时ul不存在,这就是为什么我添加“如果当前条目与上一个有效条目相同,则不检查其他任何内容”。
非常感谢任何想法。
答案 0 :(得分:0)
最后,这是一个非常好的方法,加上一些小修改。也许这会对试图实现这个的人有用...因为这是一个非常着名的问题,验证会在你在扩展器的OnClientItemSelected
上设置的任何js代码之前触发。
1)我添加了一个隐藏的SelectedText,以跟踪自动完成中输入的最后一个有效文本。该字段通过OnClientItemSelected填充。这包括回发和页面级验证期间的验证。
2)我修改了挂钩到CustomValidator的ValidateLookup函数:
function ValidateLookup(sender, args) {
var selectedText = $("#" + sender.controltovalidate)
.parent()
.children()
.filter("[id$=_selectedText]").val();
var isValidEntry = args.Value != "" && selectedText == args.Value;
if (isValidEntry)
args.IsValid = true;
else {
var acEntries = $("#" + sender.controltovalidate)
.parent()
.children()
.filter(function() {
return this.innerText == args.Value;
});
args.IsValid = acEntries.length > 0;
}
}
我用来扫描自动完成框的过滤器功能就是处理通常需要转义的字符(带有反斜杠,撇号等的自动完成中的条目)。