2011-01-10 55 views
0

我試圖在我們自己的查找控件(實際上是一個包含Ajax AutoCompleteExtender和一個CustomValidator)的包裝上實現IsRequired屬性。如您所知,對查找控件執行適當的驗證不僅涉及檢查,而且控件也不是空的,條目必須實際存在於查找預測列表中。CustomValidator在Ajax上實現IsRequired AutoCompleteExtender

我與有線連接到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不存在,這就是爲什麼我添加了「如果當前條目與最後一個有效條目相同則不檢查其他內容」的原因。

任何想法,不勝感激。

回答

0

最後,這是一個相當不錯的方法,再加上一些小的修改。也許這對試圖實現這個目標的人有用......因爲無論您在擴展程序的OnClientItemSelected上設置了什麼js代碼,驗證都會觸發,這是一個非常有名的問題。

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

,我使用掃描自動完成框中的濾波器功能只是爲了應付通常需要轉義字符(項在自動完成與反斜槓,撇號等)。