CustomValidator для реализации IsRequired на Ajax AutoCompleteExtender - PullRequest
0 голосов
/ 11 января 2011

Я пытаюсь реализовать атрибут 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 голосов
/ 26 января 2011

В конце концов это был довольно хороший подход, плюс некоторые незначительные модификации. Может быть, это будет полезно кому-то, пытающемуся реализовать это ... так как это очень известная проблема, что проверка запускается ДО того, какой js-код вы установили в OnClientItemSelected.

расширителя.

1) Я добавил скрытый текст SelectedText, чтобы отслеживать последний действительный текст, введенный в автозаполнение. Это поле заполняется через OnClientItemSelected. Это включает проверку во время обратных передач и проверку на уровне страницы.

2) Я изменил функцию ValidateLookup, подключенную к CustomValidator:

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

Функция фильтра, которую я использую для сканирования поля автозаполнения, предназначена только для символов, которые обычно необходимо экранировать (записи в автозаполнении с обратными слешами, апострофами и т. Д.).

...