微軟Asp.net Ajax 1.0的AutoComplete控制項的幾處修正和增強

來源:互聯網
上載者:User

原帖:http://blog.csdn.net/moremoreTea1983/archive/2007/06/13/1651273.aspx

隨Asp.net Ajax 1.0發布的AjaxControlToolkit系列控制項給開發人員帶來了很多便利,但其中很多控制項似乎並沒有我們想像的那麼完美。最近對這裡面的AutoComplete控制項用得較多,發現了它的幾個不足或錯誤之處:
1.在某些情況下會出現“two components with the same id”的錯誤;
2.容易導致在IE中出現“無法開啟Internet網站,…,已終止操作”的問題;
3.即使使用者輸入了很多的字元,即使已經沒有相匹配的結果,它仍然會調用服務端方法,試圖擷取相匹配的值,白白增加了伺服器的負擔;
4.自動完成列表的樣式不太好看;
5.服務端方法的簽名必須是:string[] GetCompletionList(string prefixText, int count),無法從用戶端取得其它需要的資料。這一點在一個頁面中有多個需要從不同資料來源擷取資料的AutoComplete控制項時尤其致命。

  要解決這些問題,首先需要知道怎樣來修改相應的代碼並使之在自己的應用中生效。值得慶幸的是,AjaxControlToolkit系列控制項是開源的,所以我們可以根據自己的需要來盡情修改。用VS2005開啟AjaxControlToolkit解決方案,開啟AutoComplete檔案夾中的AutoCompleteBehavior.js檔案,修改並重新編譯後,將產生的AjaxControlToolkit.dll檔案更新到自己的項目引用中,即可應用我們最佳化和增強後的AutoComplete控制項了。

  那麼,具體需要修改哪些代碼呢?
針對第一個問題,需要在AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose');這一行之前加上:

        if (this._popupBehavior) {
            this._popupBehavior.dispose();
            this._popupBehavior = null;
        }
第二個問題,要將document.body.appendChild(this._completionListElement);這一行修改為            element.parentNode.appendChild(this._completionListElement);

  第三個問題,需要在_onTimerTick方法中,為if (text.trim().length < this._minimumPrefixLength) 這個判斷增加一個條件,變成:if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10) ,這就使得,當使用者的輸入超過10個字元時,就不必向服務端調用讀取匹配值的方法了。

  第四個問題,要調整自動完成列表的樣式,可以直接修改initializeCompletionList方法中的以下代碼:

        completionListStyle.backgroundColor = this._textBackground;
        completionListStyle.color = this._textColor;
        completionListStyle.border = 'solid 1px buttonshadow';
        completionListStyle.cursor = 'default';
        completionListStyle.unselectable = 'unselectable';
        completionListStyle.overflow = 'hidden';

,或者刪除這幾行,並添加:element.className = "completionList";然後在頁面上添加樣式類“completionList”的定義即可;

  要解決最後一個問題,應該在 { prefixText : this._currentPrefix, count: this._completionSetCount}這一行中增加一個發給伺服器的參數,變為:
{ prefixText : this._currentPrefix, count: this._completionSetCount , srcId: this.get_element().getAttribute("srcid") }
從而,服務端的讀取自動完成清單項目的方法簽名就可以寫成:string[] GetCompletionList(string prefixText, int count ,string srcId)。這意味著,我們可以為需要應用自動完成功能的文字框預先設定一個用於標識其資料來源的標識字串,C#代碼如:tb.Attributes.Add("srcid", "xxx"); 然後,在GetCompletionList方法中就可以根據用戶端傳過來的這個參數值來有針對性地讀取資料了。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.