2011-01-10 4 views
0

Я пытаюсь реализовать атрибут IsRequired на нашем собственном контроле поиска (на самом деле это обертка, содержащая Ajax AutoCompleteExtender и один CustomValidator). Как вы знаете, реализация правильной проверки для контроля поиска не просто включает проверку, так как элемент управления не пуст, запись должна фактически существовать в списке прогнозов поиска.CustomValidator для реализации IsRequired на Ajax AutoCompleteExtender

Я делаю это с помощью следующего 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

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

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

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

Смежные вопросы