在上一次的Ajax操作中,我們使用了ASP.NET原生控件實現,但是弊端很多,效率低下,而且有個文件上傳的BUG:http://blog.csdn.net/zhaoqiliang527/article/details/4457961。
於是我們尋求更好的實現方式,jQuery的Ajax方法配合ashx一般處理程序。jQuery的好處是兼容性強(背后有一個團隊專門負責開發),易用(找個API幾分鍾就學會了),功能強大(對原生js進行了封裝,直接調用方法即可實現很多功能)。Ashx一般處理程序則是MS自家的,從名字可以看出它是用來處理一些東西的(原諒我才疏學淺),而且它在執行的過程中不會對整個頁面的生命周期重建,這就避免了控件樹生成帶來的開銷問題。好了,下面我們來講講,這兩者如何結合可以實現ajax,首先我們建立一個頁面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ashxAjax.aspx.cs" Inherits="WebApplication1.ashxAjax" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>jQuery實現Ajax</title> <script type="text/javascript" src="JavaScript/jquery-11.js"></script> <script type="text/javascript"> $(function () { $("#txtId").blur(function () { var a = $("#txtId").val(); $.ajax({ type: "post", url: "Handler1.ashx", data: { m: a }, success: function (result) { var res = result.toString(); $("#lblShow").html(res); } }); }); }); </script> </head> <body> <form id="form1" runat="server"> <div> 昵稱:<asp:TextBox ID="txtId" runat="server"></asp:TextBox><asp:Label ID="lblShow" runat="server" ForeColor="Red"></asp:Label><br /> </div> </form> </body> </html>
在這里面我在頁面頭部引用了最新的jQuery-1.11(好吧那個js文件名字沒取好),然后在頁面放入一個文本框用於輸入昵稱,同時在后面有個Label,用於顯示用戶名是否被注冊的消息。
接下來我們就可以用到jQuery的ajax方法,在本例中,我們的需求是輸入昵稱后,文本框失去焦點,然后檢測該昵稱是否存在,於是就有了$("#txtId").blur方法。接下來失去焦點后,我們需要獲取文本框的值,然后向ashx文件發起ajax請求:$.ajax({type: "post",url: "Handler1.ashx",data: { m: a },success: function (result) {var res =result.toString();$("#lblShow").html(res);}});
注意這幾個參數一定要寫全,首先是提交的方式,我們這里用的是post的方式。然后是URL,就是我們的ashx文件的路徑,接下來是參數,在這里我們傳入文本框輸入的昵稱。最后有個success,它表示在請求成功后后續的操作,這里我們是將處理的結果用於Label文字的顯示。
在前端寫好js后,我們來看看我們的ashx文件中的代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebApplication1 { /// <summary> /// Handler1 的摘要說明 /// </summary> public class Handler1 : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string Name = context.Request.Params["m"].ToString(); if (userHelper.CheckName(Name) == false) { context.Response.Write("該昵稱已被注冊!"); } else { context.Response.Write("恭喜,此昵稱可以使用!"); } } public bool IsReusable { get { return false; } } } }
在這個ashx文件中,我們先將傳進來的名稱作為參數,去調用我們上一節的userHelper類檢測昵稱是否存在,然后在返回值后再返回不同的文字,用於顯示,我們來一起看看效果:
此時發現失去焦點后,代碼已經進入斷點,這表明我們的ajax請求已經成功!
而根據數據庫所示:豆豆這個昵稱是存在的,因此我們會在userHelper類中進行處理,並返回false之后,提示用戶該昵稱已經存在:
我們再來看看輸入一個不存在的:最終的結果是提示用戶可以使用。
這樣表明我們已經實現了jQuery+ashx一般處理程序的方式實現了無頁面刷新檢測用戶名的ajax方式。
目前在大多數企業開發中,這種ajax實現方式用的較為廣泛,它不僅操作容易,而且是輕量級實現,ashx可以返回json字符串,也可以返回xml文件,極為靈活,所以推薦大家都使用這種方式去實現ajax。但是這樣的ajax依然不是最原始的實現方式,因為ajax的本意是“Asynchronous Javascript + XML”(異步JavaScript和XML),下次我們一起來探索最后一種用原生的javascript去實現ajax功能的方式,敬請期待!