Hopes

          Start Here..

           

          回調等。

          網上關于ASP.NET2.0 Callback的介紹已經很多了,但是全面系統講述并帶有示例的還比已經系統講述較少。正好這幾天在研究SharpMap的AjaxMap控件,就搜集和整理了這方面的資料。為了方便大家的學搜集大家為了習,同時節省大家搜集和閱讀資料的時間,我就寫了這篇搜集閱讀節省博文,希望不是畫蛇添足,呵呵。其中可能會摘引一些其畫蛇添足希望一些它文章的段落(稱為“雜文”^-^),在此表示感謝,如果作者覺得我侵犯了版權,請聯系表示聯系版權我修改刪除。

          1 Postback VS Callback

          1.1 ASP.NET1.1中的Postback機制

          在asp.net1.1中,我們知道每個服務器控件都有一個AutoPostback屬性。它的作用是當用戶(客戶端)修改該控件的值,即用戶客戶作用也可以說是當該控件的事件觸發的時候,客戶端就通過JavaScript:__doPostback(object,EventArgument)來和服務端實現通信。它使得程序員在實現動態的獲取服程序員實現獲取務端數據變得非常方便。例如:有一個查詢成績的頁面,成績例如查詢由一個DrowDownlist和一個DataGrid來實現。其中DropDownlist從服務綁定所要查看的學期(2003-2004上半學期,2003-2004下半學期等),DataGrid而是用來顯示他在改學期所有科目的成績,和該學科的學成績顯示而是分。在ASP.NET1.1中我們最常使用的方法也就是將DrowDownlist的AutoPostback屬性設置為True,并把該事件觸發服務端后臺的某個方法,該方法獲取所事件方法獲取選擇的學期的id號,然后去數據庫獲得DataTable重新綁定與DataGrid并將它顯示出來。在這整個過程中,作為用戶肯定是要經顯示出來用戶歷一個刷新頁面的過程。如果僅像剛才那個例子所說這個刷新剛才頁面刷新不會很大的影響用戶的Experience,不過如果你有一個復雜的填寫表單的頁面,該頁面有大不過頁面復雜量的Control是相關的,需要更據其它Control的選擇情況去動態的綁定數據,那當用戶填完這個表單的數據動態情況時候也許眼睛也花了,他也許再也不想經歷如此痛苦的折再也眼睛也許磨了,從Experience方面來講將是非常差的。在不是從服務端獲取大量數據的獲取非常數據情況下,我們要如何才能避免這種在用戶看似多余的Postback呢?

          1.2 ASP.NET2.0中新功能Script Callback介紹

          在ASP.NET2.0中,客戶端的腳本功能已經被擴展了。并且增加了Script Callbacks(通過腳本建立于后臺的鏈接,后文將其翻譯為客戶端呼翻譯腳本建立叫)。你可以用程序去控制<head>標簽,通過程序控制input焦點,讀取或者設置頁面的標題,并且可以控制button或其他的控件提交到其他任何頁面(in the application)。具體您可以查看Beta 1說明,里面有例子和參考。
          為了使用ASP.NET2.0中的客戶端呼叫技術,你需要在頁面中定義一個觸發元件技術定義觸發(不是提交按鈕Submit button)并且把它綁定上JavaScript代碼。這段代碼會重新獲得當前頁面的input數據并且準備去呼叫系統提供的一個稱為WebForm_DoCallback的Script函數(Beta1)。這個函數會建立一個和一個指定的遠程ASP.NET頁面建立HTTP連接。后臺偵聽到這個來自客戶端的呼叫后呢,對此觸發來自觸發連接一個方法。服務端通過先前的客戶端的函數返回一個值。方法函數客戶在客戶端,通過一個用戶自定義的腳本函數來獲得服務端定義腳本函數的值并且用DHTML將其呈現在頁面上。重要的是,這樣做客戶端和服務端的這樣頁面客戶通信仍舊在進行,但是頁面并沒有重新刷新。更重要的是刷新進行仍舊,當客戶端在獲取數據的時候用戶仍舊可以在它原來的頁可以仍舊獲取面上操作。

          2 Callback VS Atlas

          我們再來談談Atlas。很多朋友可能會覺得奇怪,已經有Callback,為什么又要出Atlas呢?關于這個問題,Atlas的作者怎么解釋,我倒沒有去調查。只不過從我個人對callback和atlas的使用感受來講,覺得,callback作為一個接口和postback非常類似的實現,肯定是為了讓用戶類似使用postback來使用它。但是,它的這個類似postback的機制,應該說使用上還不是特別方便,也不易擴展,當應該特別使用然這是相比于其他的AJAX框架實現來說的。因此,微軟方面借鑒了許多的已有的AJAX實現,如Prototype,Backbase以及AJAX.NET,并結合ASP.NET2.0的部分特有功能,發明了這樣一個博采眾長的AJAX框架。基于Atlas來開發AJAX應用有多好,很難量化的來說,但至少不比其他的這些AJAX框架來的差是肯定的,加上微軟這個后臺,以及像live.com這樣的重量級站點的應用推廣,其影響當然是值得期待的重量級這樣應用

          不過,這也不是說Callback實現沒一無是處了,作為程序員,我們需要有正確的態度一無是處態度我們,在正確的使用情形,使用最正確的技術。沒有哪一個框技術沒有情形架是萬能的,是適合任何使用環境的;就像大家都在爭論環境爭論適合那個軟件開發方法最好,CMMi,RUP,XP,AGILE~~,其實,沒有最好,最合適的才是最好的。我們最應該做應該我們沒有的,是了解各種方案的原理和優缺點,從而,合理的使用方案各種原理正確的工具來解決實際問題。Callback的好處就是簡單,在Asp.net 2.0不需要額外的支持。

          3 Callback原理

          Callback可以翻譯成“客戶端回調”。在期望不執行Postback而從客戶端調用服務器代碼的情況下,可以使用ClientScriptManager類來調用客戶端回調。這稱為對服務器執行帶外回調。在服務器執行調用客戶端回調中,客戶端腳本函數向ASP.NET網頁發送異步請求。網頁修改其正常生命周期來處理回調請求正常異步

           回調的過程如下所示:

          1)客戶端發出請求,請求內容包括:指定更新控件和傳遞請求包括內容參數。

          2)服務端響應、處理。

          3)服務端將處理后的內容以字符串返回。

          4)客戶端使用一個函數接受返回值

          5)客戶端更新指定控件。

          創建實現客戶端回調的ASP.NET頁,必須實現ICallbackEventHandler接口。

          先聲明該接口,方法如下:

          public partial class CallBackExample

           : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler

          {… …}

           實現ICallbackEventHandler接口的兩個固定名稱的方法,RaiseCallbackEvent(eventArgment)和GetCallbackResult()。RaiseCallbackEvent()方法是回調執行的方法,在這個方法中處理回調的內容,內容方法執行它沒有返回值,它從瀏覽器接受一個字符串作為事件參數瀏覽器字符串參數,即該方法接受客戶端JavaScript使傳遞的參數,注意它是首先觸發的。接下來觸發的就是接下來參數注意GetCallbackResult()方法,它將所得到的結果傳回給客戶端的JavaScript,JavaScript再將結果更新到頁面。

              客戶端使用ClientScript.GetCallbackEventReference()方法實現回調。這個方法用幾個參數其中一個指定關聯上參數關聯方法下文,一個指定返回客戶端的函數名稱。

          Public string GetCallbackEventReference (Control control,string argument,string clientCallback,string context)

          參數與返回值說明:

          參數

          作用

          control

          處理客戶端回調的服務器Control。該控件必須實現ICallbackEventHandler接口并提供RaiseCallbackEvent方法。

          argument

          從客戶端腳本傳遞一個參數到服務器端的RaiseCallbackEvent方法。

          clientCallback

          一個客戶端事件處理程序的名稱,該處理程序接收服務器服務器事件程序端事件返回的結果。

          context

          啟動回調之前在客戶端的客戶端腳本信息。腳本的結果傳腳本結果客戶回給客戶端事件處理程序。

          返回值

          調用客戶端回調的客戶端函數的名稱。

           注意:ClientScript.GetCallbackEventReference()方法在客戶端必須有控件來調用,調用的控件不是我們經方法我們調用常使用的服務器端控件,而是一個HTML元素。在控件中添加一個onclick事件,點擊該按鈕這將向服務器端發出回調請求。

          下面是ClientScriptManager.GetCallbackEventReference方法的重載列表

          名稱

          說明

          ClientScriptManager.GetCallbackEventReference (Control, String, String, String)

          獲取一個對客戶端函數的引用;調用該函數時,將啟動一調用函數獲取個對服務器端事件的客戶端回調。此重載方法的客戶端函服務器事件方法數包含指定的控件、參數、客戶端腳本和上下文。

          ClientScriptManager.GetCallbackEventReference (Control, String, String, String, Boolean)

          獲取一個對客戶端函數的引用;調用該函數時,將啟動一調用函數獲取個對服務器端事件的客戶端回調。此重載方法的客戶端函服務器事件方法數包含指定的控件、參數、客戶端腳本、上下文和布爾值上下文參數腳本

          ClientScriptManager.GetCallbackEventReference (Control, String, String, String, String, Boolean)

          獲取一個對客戶端函數的引用;調用該函數時,將啟動一調用函數獲取個對服務器端事件的客戶端回調。此重載方法的客戶端函服務器事件方法數包含指定的控件、參數、客戶端腳本、上下文、錯誤處上下文參數錯誤理程序和布爾值。

          ClientScriptManager.GetCallbackEventReference (String, String, String, String, String, Boolean)

          獲取一個對客戶端函數的引用;調用該函數時,將啟動一調用函數獲取個對服務器端事件的客戶端回調。此重載方法的客戶端函服務器事件方法數包含指定的目標、參數、客戶端腳本、上下文、錯誤處上下文參數錯誤理程序和布爾值。我們就整個程序作個系統的說明,并且列出前臺的頁面代列出說明系統碼和后臺的邏輯代碼,這樣可以使得你對程序有個直觀的可以代碼程序理解。

           

          4 示例

          在后臺寫個public string,在Page_Load中給他賦值為:=Page.ClientScript.GetCallbackEventReference(this, "message"clientscript messag string;, "ShowServerTime", "context");注意在這里是Page.ClientScrip,因為他會返回個ClientScriptManager,ClientScriptManager管理showservertim clientscrip context所有的客戶端腳本。然后在前臺某個按鈕的onclick事件里<%=那onclick 事件腳本個public后臺字符串%>.做個小實驗代碼如下:

          前臺ServerTime.aspx:為了方便去掉好多沒用的html

          <%@ page language="C#" CodeFile="ServerTime.aspx.cs" Inherits="ServerTime_aspx" %>
          <html>
          <head>
          <title>Server Time</title>
          <script language="javascript">

          function GetServerTime()
          {
           var message = '';
           var context = '';
           <%=sCallBackFunctionInvocation%>
          }

          function ShowServerTime(timeMessage, context) {
           alert('現在服務器上的時間是:\n' timeMessage);
          }
          </script>
          </head>
          <body>
          <form id="MainForm" runat="server">
          <input type="button" value="得到服務器端時間" onclick="GetServerTime();" />
          </form>
          </body>
          </html>


            后臺:

          using System;
          using System.Web.UI;

          public partial class ServerTime_aspx : Page,ICallbackEventHandler
          {
           //一定要實現ICallbackEventHandler借口
           public string sCallBackFunctionInvocation;

           void Page_Load(object sender, System.EventArgs e)
           {
            sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, "message", "ShowServerTime", "context");
           }

           public string RaiseCallbackEvent(string eventArgument)
           {
            return DateTime.Now.ToString();
           }
          }

          posted on 2014-01-08 21:28 ** 閱讀(117) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學習

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 敦化市| 扶风县| 定西市| 阜新| 金秀| 浙江省| 襄垣县| 武胜县| 阜平县| 潞西市| 特克斯县| 阳信县| 西昌市| 仁怀市| 邓州市| 来凤县| 咸宁市| 湛江市| 小金县| 浠水县| 沭阳县| 潞西市| 石狮市| 太保市| 天柱县| 松阳县| 南宫市| 石屏县| 石台县| 巴青县| 玉田县| 越西县| 伊通| 金坛市| 淮北市| 菏泽市| 淄博市| 衡东县| 三亚市| 台北县| 万全县|