asp.net Ajax 終極解決方案

銀河使者發表於2008-05-01
ajax 在目前 web 領域已廣泛應用,其真正核心只不過是一個封裝好了的 js 庫。最五花八門的莫過於 asp.net 的控制元件,我個人認為 ajax 只是一個輕量級的東西,根本沒有必要將它寫成伺服器元件,如 ajax.net、AjaxControlToolkit 等。所以我一直視這些元件為垃圾。。。

以下說明我為什麼不認同 ajax 的相關元件:

1、將 ajax 封裝得太死,出現問題難於除錯;
2、元件過於臃腫,太多沒有用的功能;
3、依賴性太強,少一樣不可,如 webform;

傳統的 ajax 應用到專案中,會出現由於專案的 ajax 應用太多,服務端的 ajax 響應函式難於管理,我們到底要把這些響應函式部署在什麼位置?

假如
index.aspx 裡有三個 ajax 響應函式,我們可以把這三個響應函式放在 index.aspx 中,並於 Page_Load 事件中根據引數不同來呼叫這些函式。
index.aspx 裡還使用了 abc.ascx,這個控制元件裡面也用到了 ajax,那麼 abc.ascx 裡的響應函式又應該放在哪裡?index.aspx 中嗎?如果 index2.aspx 中也用到了 abc.ascx,難道還要複製 index.aspx 的處理函式到 index2.aspx,這樣肯定不行;
我們可以新建一個 ajax.aspx 來處理所有的 ajax 響應,php/asp 都可以這樣做。這樣管理還是不理想,
最理想的管理方法應該是頁面、控制元件與響應函式整合。ICallBackEventHandler 可以做到,但是它依賴 webform,假如你的頁面中沒有一個
,則會失效。
問題迴歸到如體使用輕量級 ajax,並實現頁面/控制元件與 ajax 響應函式整合。

Reflector 檢視 System.Web.UI.Page 裡面處理 ICallBackEventHandler 模組後,我們可以這樣做:

1、所有頁面繼承 BasePage;
2、BasePage 繼承 System.Web.UI.Page,重寫 BasePage.OnLoad;
3、實現 AjaxHandler
4、新增 Ajax 類,實現 Ajax.Register 靜態方法

程式碼如下:
public class BasePage : Page {
    protected override void OnLoad(EventArgs e) {
        AjaxHandler();
        base.OnLoad(e);
    }

    ajax handler#region ajax handler
    //我喜歡用 json 格式資料來返回給客戶端處理
    protected void AjaxHandler() {
        string ajax_target = Request.Form["ajax_target"];
        if (string.IsNullOrEmpty(ajax_target)) return;

        Control target = FindControl(ajax_target);
        if (target == null) return;

        MethodInfo method = target.GetType().GetMethod("IAjax");
        if (method == null) return;

        Response.Cache.SetNoStore();

        Response.Write("(");
        method.Invoke(target, null);
        Response.Write(")");
        Response.End();
    }
    #endregion
}

public class Ajax {
    public static string Register(Control control, string function, string argument) {
        if (control == null) return "//This control can not be NULL.";
        return string.Format("ajax({0},'{1}','ajax_target={2}{3},'post','{4}');", function, HttpContext.Current.Request.Url.PathAndQuery,
            HttpContext.Current.Server.UrlEncode(control.UniqueID), string.IsNullOrEmpty(argument) ? "'" : "&'+" + argument,
            HttpContext.Current.Response.Charset);
    }
}

我在 Page.OnLoad 前處理 ajax,通過 Request.Form["ajax_target"] 得到將要呼叫的目標,然後反射到目標的 IAjax 這個名字的函式(這裡命名有問題,我隨便命的),最後通過反射呼叫它並 Response.End
Ajax.Register 是註冊一個 Ajax,和 ICallBackEventHandler 的使用方法一樣,但不同的是現在不需要依賴 webform 和 asp.net 自帶的 js庫。它依賴傳統的 ajax.js 庫,並且通用 POST 自己傳入引數
我沒有寫 ClientScript.RegisterClientScriptBlock 頁面自動包含 ajax.js,有興趣的可以自己改,到時你會遇到 ClientScript.RegisterClientScriptBlock 也依賴 webform,哈哈。。。你需要重新實現相應方法才可以,有興趣可以直接詢問我。

使用方法:abc.ascx








這樣一來,我們就輕鬆的將 ajax 部署到 UserControl/Page 中,不再依賴 asp.net 的不太好的東西。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-259937/,如需轉載,請註明出處,否則將追究法律責任。

相關文章