本帖并無高來高去的高深技術,但提供一個做 ASP.NET 項目時,很實用的 Ajax 示例下載。透過 AJAX.NET 的功能,改善舊式 Callback 寫法的缺點,讓用戶在一或多個 TextBox 輸入完查找條件、鼠標離開并觸發 onBlur 事件時,透過 JavaScript 調用 C# 自定義類的函數,實現高速訪問數據庫、查找對應多個字段的值。
之前我曾寫了一篇「用 ASP.NET Callback 和 JavaScript 高速訪問數據庫」,并提供示例下載,內容是用 Callback 異步調用技術 (ASP.NET AJAX 還沒出現前,微軟提供的過渡技術),讓 Client-side (JavaScript) 能和 Server-side (.NET CLR) 直接溝通,讓用戶在 TextBox 失去焦點、觸發 onBlur 事件時,能透過 C# 自定義類的函數,以相當高的效率訪問數據庫并返回值。但該示例有兩個缺點:
- 只能透過固定單一個內附的 RaiseCallbackEvent 函數,去訪問數據庫。當頁面上有多個 TextBox 同時要實現相同功能時,程序撰寫上會很困難。
- 無法透過 try-catch-finally block 捕捉錯誤信息。當發生錯誤時,也無法提供相關信息給用戶或程序員。
因為在 ASP.NET 項目中常會用到此一功能,因此日前我用 AJAX.NET 這套 free library 重寫了一個示例 (相關的 dll 已內附), 下載地址及功能如下:
-------------------------------------------------
本帖的示例代碼下載點:
https://files.cnblogs.com/WizardWu/090828.zip
(執行本示例,需要 SQL Server 的 Northwind 數據庫,以及 VS 2008 或 IIS)
-------------------------------------------------
此示例功能:
- 如下圖 1,在第一個 TextBox1 輸入 EmployeeID,鼠標離開 TextBox1 失去焦點、觸發 onBlur 事件時,會自動高速訪問數據庫,取得該筆記錄的另外兩個字段,顯示在下方的兩個 TextBox 中。
- 如下圖 2,當用戶輸入不合理的 EmployeeID 時,會提示錯誤信息,并清空另外兩個 TextBox 里既有的文字。
- 當用戶輸入不存在于數據表 Employees 的 EmployeeID 時,會提示錯誤信息,并清空另外兩個 TextBox 里既有的文字。
- 當用戶手動清空 TextBox1,鼠標離開 TextBox1 失去焦點、觸發 onBlur 事件時,會清空另外兩個 TextBox 里既有的文字。

圖 1 網站項目中常用到的功能。以本示例的做法,不論網頁上有多少個 TextBox 需要此功能,都不會相互干擾

圖 2 輸入不合理或錯誤類型的 EmployeeID,JavaScript 接收到 C# 返回的錯誤信息
關鍵代碼如下:
Default.aspx.cs
{
protected void Page_Load(object sender, EventArgs e)
{
//設置 TextBox 的 OnBlur 事件被觸發時,所要調用的 JavaScript 函數
this.TextBox1.Attributes["onblur"] = "getEmployeeInfo('TextBox1', 'TextBox2', 'TextBox3');";
this.TextBox4.Attributes["onblur"] = "getProductInfo('TextBox4', 'TextBox5', 'TextBox6');";
//設置在 JavaScript 文件中,所能調用的 C# 自定義類的名稱
Ajax.Utility.RegisterTypeForAjax(typeof(MyClass01));
}
}
我們看到上方,透過 RegisterTypeForAjax 函數,可向 AJAX.NET 注冊我們寫的 C# 自定義類 MyClass01。接著 AJAX.NET 會瀏覽這個自定義類,里面標示有 AjaxMethodAttribute 的函數,如下方代碼中的 getEmployeeInfo 和 getProductInfo 函數,我們并在這兩個函數里,實際去訪問數據庫并取回需要的一或多個字段的值。
如下,onBlur 事件被觸發時,會在 JavaScript 里調用 C# 的同名函數,并從數據庫里取得返回值。
如下,在 web.config 里添加配置,讓所有 ajax/*.ashx 的請求,改由 Ajax.PageHandlerFactory 產生的 HTTP Handler 處理,而不再由默認的 System.Web.UI.PageHandlerFactory 處理程序工廠 [9] 來處理。
因為此一需求我在 ASP.NET 項目常遇到,因此特地整理成一篇文章。若有網友知道 ASP.NET AJAX 3.5 有更好的做法,亦請留言告知。
--------------------------------------------------
相關文章:
[1] AJAX.NET 用戶開發指南, 程守華 譯, 原出處:博客園
http://dev.yesky.com/msdn/398/2307398.shtml
[2] AJAX .Net Wrapper usage guide (Ajax.dll 下載內附 Word 文件)
http://ajax.schwarz-interactive.de/download/ajax.zip
[3] Ajax.Utility.RegisterTypeForAjax(typeof(Chat))
http://forums.asp.net/p/1178313/1990148.aspx
[4] AJAX.NET 安裝配置全指南
http://developer.51cto.com/art/200908/142497.htm
http://developer.51cto.com/art/200601/16545.htm
[5] 在 vs 2005 中使用 ajax.dll
http://maybe723.javaeye.com/blog/87341
[6] 在asp.net 1.1中運用AjaxPro簡要步驟
http://www.rzrgm.cn/wlb854/archive/2006/10/08/523143.html
[7] ASP.NET ajax.dll ajaxmethod 使用技巧總結
http://and114.blog.hexun.com/34187290_d.html
[8] Ajax 實現無刷新三聯動下拉框 - 小山 - 博客園
http://singlepine.cnblogs.com/articles/257954.html
[9] PageHandlerFactory 類 (msdn)
http://msdn.microsoft.com/zh-cn/library/system.web.ui.pagehandlerfactory(VS.80).aspx
--------------------------------------------------
浙公網安備 33010602011771號