紀錄一下在ASP.Net 上使用AJAX呼叫Webmethod方法,做這個是因為有一項需求是要在Textbox下方,顯示資料庫搜尋的內容,依據每次在TextBox輸入的值,大概類似Google搜尋效果。

事實是JQuery的AutoComplete方法簡易實現,但AutoComplete需要事先將資料寫入前端,在這個需求中不是用的原因是:

1. 需求希望能開發出一公用的呼叫方式,每次只需在資料邏輯綁定Textbox即可,而不是每次寫死在前端中。 

2.不同TextBox藉由綁定不同的Key讓DB識別要綁定那些內容到此Textbox下方。

3.每次在Textbox中輸入值會重新對DB獲取資料。

    這有一缺點是經常性對DB取資料,可能會造成網路不佳的使用者在此功能的體驗不佳,若要避免此缺點,必須在畫面初始時把所有資料全部寫入前端畫面,但在我的情況來說,所有的資料過於龐大,不建議使用這個方法。

 依我的例子來說使用XML傳輸DB資料,只要超過三百筆就會出現明顯卡頓,有三百筆以上的需求的可以使用JSON NET這方法實現,需要先把Newtonsoft.JSON加入參考。

首先是實作對DB取資料的function,所有WebMethod呼叫的方法一定要是Static。

    [WebMethod]
    public static string Search(string Key, string Text)
    {

            假設dtData為資料庫取回的資料

 
            //JOSN NET
            string xmlInput = dtData.DataSet.GetXml();

            // 透過XmlDocument讀入
            System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
            xmlDoc.LoadXml(xmlInput);

            // 透過Json.NET將XmlNode轉為Json格式字串
            string jsonText = Newtonsoft.Json.JsonConvert.SerializeXmlNode(xmlDoc);

            return jsonText;

            //XML
            return dtData.DataSet.GetXml();
        }

    }

 

前端透過AJAX呼叫 ,Key是DB識別使用哪個SQL的值,Text 是被綁定TextBox的內容,的作法是將這個AJAX呼叫寫在該TextBox的onKeyup,即可每次被鍵入值時重新綁定值。

var key = 'Key_1';

var Text = $('#Textbox_1').val();

$.ajax({
            type: "POST",
            url: "Default.aspx/Search",
            data: "{Key : '" + Key + "' ,Text : '" + Text + "'"},
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (r) {

            console.log(r);

             //實作透過回傳XML動態生成TABLE,要先寫出一個TABLE只有一列 和N個欄位,接著再用JQuery append加入TABLE以新增列。

            這部分網上有其他更詳細的介紹,這裡就不示範不然文章太長。      

            },  ,
            failure: function (request) {
                console.log(request);
            },
            error: function (response) {
                console.log(response);
            }   
    

我的作法是同時只會有一個搜尋結果視窗,每當搜尋結果被點擊後回寫內容到TEXTBOX,並且把TABLE物件刪除,每次呼叫AJAX時才會新增TABLE以供塞入資料。

用意是方便使用同一個ID進行控制,也更好理解。

這個東西挺有趣的,可以加入很多其他功能,例如固定標題列、擊搜尋結果後觸發 特定控制項的postback、Textbox間的相依性、依照搜尋結果每一欄位的型態自動定義寬度、每次固定搜尋N筆當ScrollBar捲到底時候再多搜尋N筆,以此類推。

得到的反饋有

1. 大小和位置必須控制得好才方便他人呼叫這個公用工具,盡量要做到呼叫少參數卻好,可以多載提供較多參數,比較細節的呼叫,但要提供一個簡易個呼叫方法。

2. DB邏輯寫得好的話,可以讓使用者在系統操作上,每次要輸入資訊時省下許多時間。

在寫這個時遇到最大的困擾是

顯示搜尋結果的位置,要控制得好不能使用CSS position absolute的top,left ,尤其是在你的網頁是由框架組合而成的,TOP LEFT位置並不準確,最後的辦法是使用margin。

小提醒:前端生成element時候要定義高度和寬度,否則怎麼樣都會看不見。

以上,希望能幫到大家。
       


留言

這個網誌中的熱門文章