1,網(wǎng)上關(guān)于ICallbackEventHandler的實現(xiàn)效果比較多,之所以繼續(xù)寫關(guān)于這個接口的使用有幾個原因:(1)時間長了,容易忘記這個接口該怎么使用,肯定又要去搜索。(2)搜索出一堆別人的博客,看著別人寫的不舒坦,不爽,所以自己按自己的想法想怎么寫就怎么寫。(3)看到自己寫的博客,幾乎很容易就立馬想起來當(dāng)時怎么使用的,很快就知道怎么使用了。(4)還有個原因就是,最近項目不緊,也不知道學(xué)點啥,就隨便敲幾行字。
2,ICallbackEventHandler接口彌補(bǔ)了Ajax框架的不足!Ajax框架比較大,會在前臺生成很多的Js代碼。而ICallbackEventHandler接口卻沒有那么麻煩,他的邏輯,也就是前臺控件觸發(fā)(click,doubleclick,mouSEOver,blur,focus),不管哪種觸發(fā)方式,讓他指定執(zhí)行前臺的一個Js方法(該方法是在后臺Page_load使用RegisterClientScriptBlock()方法注冊到前臺)。然后這個Js方法會執(zhí)行后臺的一個方法,后臺根據(jù)參數(shù)經(jīng)過業(yè)務(wù)處理,將處理結(jié)果賦值給一個屬性,然后后臺回調(diào)方法中將這個屬性的值返回,頁面前臺早已注冊好的方法便會根據(jù)這個返回值進(jìn)行相關(guān)處理。
3,根據(jù)這個邏輯,我寫了一個小的Demo,根據(jù)用戶輸入的手機(jī)號,判斷當(dāng)前手機(jī)號是否已經(jīng)注冊。
(1),前臺HTML代碼
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/Javascript"> function receiveServerDataNew(returnVal) { $("#warn").html(returnVal); } $(function () { $("input[id*='TB_MobilePhone']").blur(function () { var mobilePhone = $("input[id*='TB_MobilePhone']").val(); callServerEvent(mobilePhone, ""); }); }) </script></head><body> <form id="form1" runat="server"> <div> 姓 名:<asp:TextBox ID="TB_UserName" runat="server"></asp:TextBox><br /> 密 碼:<asp:TextBox ID="TB_HiddenCode" runat="server"></asp:TextBox><br /> 手機(jī)號:<asp:TextBox ID="TB_MobilePhone" runat="server"></asp:TextBox><span id="warn" style=" color:Red";></span> </div> </form></body></html>
(2),后臺代碼
public partial class _Default : System.Web.UI.Page,ICallbackEventHandler { PRotected void Page_Load(object sender, EventArgs e) { //獲取一個對客戶端函數(shù)的引用;調(diào)用該函數(shù)時,將啟動一個對服務(wù)器端事件的客戶端回調(diào)。此重載方法的客戶端函數(shù)包含指定的控件、參數(shù)、客戶端腳本和上下文 String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "receiveServerDataNew", "context"); String callbackScript = "function callServerEvent(arg, context)" + "{ " + cbReference + ";}"; //往前臺注冊腳本 Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callServer", callbackScript, true); } private string _CallBackResult = ""; public string GetCallbackResult() { return _CallBackResult; } public void RaiseCallbackEvent(string eventArgument) { if (eventArgument=="") { _CallBackResult = "手機(jī)號不能為空"; } //自己查數(shù)據(jù)庫去吧 if (eventArgument=="18866668888") { _CallBackResult = "當(dāng)前手機(jī)號已經(jīng)注冊"; } } }
4,頁面一加載,首先執(zhí)行后臺的Page_Load事件,然后callServerEvent這個方法就注冊到前臺了,前臺頁面一生成,便給手機(jī)號那個文本框注冊了,失去焦點事件,失去焦點的事件里面執(zhí)行callServerEvent()方法(傳入倆個參數(shù)),調(diào)用后臺的RaiseCallbackEvent(string eventArgument)方法,該方法經(jīng)過業(yè)務(wù)邏輯處理,賦值給_CallBackResult屬性,GetCallbackResult()方法將處理結(jié)果返回,同時調(diào)用前臺方法receiveServerDataNew(),該方法便根據(jù)后臺的處理結(jié)果,進(jìn)行頁面處理。
新聞熱點
疑難解答