我正在尝试在我们自己的查找控件(实际上是一个包含一个Ajax AutoCompleteExtender和一个CustomValidator的包装器)上实现一个IsRequired属性。正如您所知道的,为查找控件实现适当的验证不仅仅包括检查控件是否为空,条目必须实际存在于查找预测列表中。
我使用以下连接到CustomValidator的ClientValidationFunction来完成此操作
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不在那里,这就是为什么我添加了“如果当前条目与上一个有效条目相同,就不要检查任何其他条目”的原因。
任何想法都是非常受欢迎的。
发布于 2011-01-27 01:16:14
最后,这是一个非常好的方法,再加上一些小的修改。也许这会对试图实现它的人有用……因为这是一个众所周知的问题,验证在您在扩展器的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;
}
}我用来扫描自动补全框的过滤器函数只是用来处理通常需要转义的字符(自动补全中的条目带有反斜杠、撇号等)。
https://stackoverflow.com/questions/4652370
复制相似问题