CustomValidator在Ajax AutoCompleteExtender上实现IsRequired

时间:2011-01-10 22:46:33

标签: javascript jquery validation asp.net-ajax

我正在尝试在我们自己的查找控件上实现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不存在,这就是为什么我添加“如果当前条目与上一个有效条目相同,则不检查其他任何内容”。

非常感谢任何想法。

1 个答案:

答案 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;
}
}

我用来扫描自动完成框的过滤器功能就是处理通常需要转义的字符(带有反斜杠,撇号等的自动完成中的条目)。