ASP.NET 2.0 用戶端無重新整理調用伺服器端方法擷取資料

來源:互聯網
上載者:User

制約B/S程式的一個重要原因可能歸結於Http協議的無狀態性,每當我們要用戶端從伺服器上擷取資料或想執行一段伺服器端代碼,我們必須先提交頁面,在頁面提交後,事件控制代碼使代碼執行並把結果返回給提交的用戶端,這個事件驅動模式在大部分情況下沒有問題,但是它卻強制ASP.NET開發人員必須多做一些事情。為了儲存表單上的控制項狀態,開發人員要麼使用大量降低頁面速度的ViewState,要麼得寫一些複雜的程式邏輯,而且這也使瀏覽器增加了處理時間。在小頁面上,這沒什麼問題,但是在一些大量DHTML應用的頁面,或內容很多的頁面上,寬頻使用者就會感覺到“閃”,而撥號使用者甚至會看見狀態列中藍色的進度條。所以,如果能在用戶端調用伺服器端代碼將是一件美好的事情,而ASP.NET 2.0 使其成為現實。ASP.NET 2.0有一個受關注的焦點是用戶端回訪功能,也就是說在頁面上用用戶端的Javascript代碼調用伺服器端代碼而不需要頁面回傳。在過去,TreeView控制項的頻繁重新整理頁面已經讓我們無法忍受,但是現在因為有了Client Callback,我們可以告別這一現象了。

在瞭解回訪技術前,我們來看看現在通常程式員是怎麼做的。由javascript訪問伺服器端代碼通常求助於微軟的XMLHTTP ActiveX組件。這個組件允許你通過http協議通過互連網擷取xml文檔,然而並不像和它的名字所表示的那樣,其實你可以用這個組件來對任何伺服器發送http請求,包括老式的asp,標準html,甚至php檔案,而僅僅收回一個未處理的html輸出。因為這個組件幾乎是一個標準的ActiveX組件,你可以用標準的javascript文法來執行個體化它:
function RetrieveGoogleFrontPage()
{  
 var XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");  
 XmlHttp.Open("GET", "http://www.google.com", false);  
 XmlHttp.Send();  
 return XmlHttp.responseText;
}
我們看到代碼非常的簡單,而所有代碼都是javascript中執行,不需要重新提交頁面,也就不會再閃了,但是請注意到,這個組件擷取的是整個頁面,所以如果你需要的僅僅是一部分資料,你需要單獨寫一個頁面來返回你需要的資料。

我們來看看ASP.NET 2.0中的Client Callback,其實在底層同樣是使用了XmlHttp技術,只不過封裝起來,對
程式員屏蔽了。Client Callback由2部分組成:新的ICallbackEventHandler介面和Page類新的靜態方法
GetCallbackEventReference()。Page.GetCallbackEventReference()方法及其重載產生了用戶端所需要的javascript程式碼片段,這些代碼在底層使用了XmlHttp組件發出了一個http請求,而伺服器端通過一個實現了ICallbackEventHandler介面的控制項接受它,通常這個控制項就是頁面自己本身,但是你也可以明確地用你自己的使用者控制項或web控制項對這個請求進行響應。當請求返回時,結果是通過另外一個javascript函數來接受的。我們來看一個從伺服器擷取系統時間並在用戶端alert出來的代碼:
<%@ page language="C#" compilewith="ServerTime.aspx.cs" classname="ASP.ServerTime_aspx"%>
<html>  
 <head>     
 <title>Server Time</title>     
 <script language="javascript">        
  function GetServerTime()        
  {           
      var message = '';
      var context = '';                              
      <%=sCallBackFunctionInvocation%>        
  }                 
  function ShowServerTime(timeMessage, context)
  {           
   alert('The time on the server is:/n' + timeMessage);        
  }                 
  function OnError(message, context)
  {           
   alert('An unhandled exception has occurred:/n' + message);
   }     
 </script>  
 </head>
<body>  
<form id="MainForm" runat="server">     
<input type="button" value="Get Server Time" onclick="GetServerTime();" />   </form>
</body>
</html>
using System;
using System.Web.UI;
namespace ASP
{
public partial class ServerTime_aspx : ICallbackEventHandler  
{      public string sCallBackFunctionInvocation;
      void Page_Load(object sender,System.EventArgs e)
      {
         sCallBackFunctionInvocation =this.GetCallbackEventReference(this,"message","ShowServerTime","context","OnError");
      }
      public string RaiseCallbackEvent(string eventArgument)
      {        
         return DateTime.Now.ToString();
      }
   }
}

這裡注意到頁面實現了ICallbackEventHandler介面,這個介面只有一個方法RaiseCallbackEvent,這個方法就是頁面接受到一個回調請求時所執行的代碼在這個例子中,簡單地返回一個系統時間。為了產生用戶端調用代碼,我們在Page_Load中調用了 Page.GetCallbackEventReference方法,這個方法有很多重載,但都包含了以下參數:即將接受請求的控制項(在這裡是當前頁),包含參數值的用戶端變數名,以及請求返回或出錯時要執行的用戶端函數。傳回值是產生的javascript代碼,在頁面上的<%=sCallBackFunctionInvocation%>在頁面執行時將被替換為:
__doCallback('__Page',message,ShowServerTime,context,OnError)
__doCallback是ASP.NET 2.0的一個公用方法,用於向伺服器回傳請求。

從中可以看出這種調用的過程。

 

注意:本文內容來自《ASP.NET 2.0's Client Callback Feature》(英文)一文,原文來自網路,作者未知,翻譯時有刪節並對一些段落加入解釋與調整。

Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1041695

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.