DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> PageMethod:用javascript呼叫server端的method
PageMethod:用javascript呼叫server端的method
編輯:AJAX詳解     

前言:

從有AJax的UpdatePanel之後,就是普遍的將新進的開發人員無腦化,講到UpdatePanel,在他們眼中就是「局部更新」、「非同步更新」、「畫面不會閃」、「比較快」、「啥都讓他Postback就好」、「不需要寫Javascript」。

這幾點,以他們的角度來看,可以說都沒錯,但也可以說錯的離譜。

 UpdatePanel的確是為了快速開發而存在,實作上的確可以省掉很多Javascript的撰寫,畫面也的確不會閃爍,這跟局部更新也有關系。只是背後隱藏著太多的操作,沒去理解架構與運作流程,真的只會造成濫用、誤解。 (雖然我不敢說我就懂AJax架構)

 UpdatePanel可以讓不熟Javascript的開發人員,快速開發類似「回呼」(CallBack)的程式。但付出的效率代價可是很大的,UpdatePanel應該是當畫面上觸發PostBack後,攔截該PostBack事件,(但是這個時候整頁的資料、VIEwState已經都傳回server端了,也就是流量effort跟整頁postback沒啥兩樣)接著再去判斷觸發PostBack的物件,是否在UpdatePanel中,若是,則代表此物件的PostBack只需局部更新相關的原始碼內容,透過XMLHttpRequest,(也就是CallBack的核心),呼叫server端的method後,再回傳執行結果,至「需要更新的區塊裡」,也就是需要更新的UpdatePanel。

 所以說,UpdatePanel真要說比較快,應該只有省Partial Render的部分(應該….應該…),AJax的重點還是在如何使用clIEnt端的script,去執行server端的code。

除了UpdatePanel外,還可以透過Javascript呼叫Web service(Web服務)或PageMethod(頁面方法),來執行server端的logic。

 重點開始:

這邊就開始介紹一下PageMethod,整理一下在網路上看到的范例,其實還蠻容易上手的。

Step1:首先,PageMethod是建立在ASP.Net AJax裡,也就是跟Scriptmanager息息相關。所以畫面上要有Scriptmanager,而且要設定一下EnablePageMethods屬性為True。

  1. <ASPExtensions:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"> 
  2. </ASPExtensions:ScriptManager> 

Step2:WebConfig要在<system.web>裡面,設定一下httpModules。

  1. <httpModules> 
  2. <add type="Microsoft.Web.UI.ScriptModule" name="ScriptModule"/> 
  3. </httpModules> 

 Step3:在ASPx裡面,拉兩個textbox出來,用來當input與output的值。

  1. <ASP:TextBox ID="TextBox1" runat="server" /> 
  2. <ASP:TextBox ID="TextBox2" runat="server" Width="200px"> 

Step4:新增一個Javascript檔,叫做TestJavaScript.JS。放在同一層目錄底下。並在ASPx的<body>之後,include該JS。

  1. <body> 
  2. <script language="Javascript" src="TestJavaScript.JS" type="text/Javascript"> </script> 

Step5:撰寫Javascript的function,CallMe()。其中,CallSuccess為XMLHttpRequest成功後要做的事,CallFailed為失敗要做的事,dest則是最後output的值要放在哪。而關鍵的一行就是Pagemethods.GetContactName()。

  1. function CallMe(src,dest)  
  2. {   
  3. var ctrl = document.getElementById(src);  
  4. // call server side method  
  5. PageMethods.GetContactName(ctrl.value,CallSuccess,CallFailed,dest);  
  6. }  
  7.  
  8. // set the destination textbox value with the ContactName  
  9. function CallSuccess(res, destCtrl)  
  10. {   
  11. var dest = document.getElementById(destCtrl);  
  12. dest.value = res;  
  13. }  
  14.  
  15. // alert message on some failure  
  16. function CallFailed(res, destCtrl)  
  17. {  
  18. alert(res.get_message());  

Step6:接著就要撰寫後置程式碼的Web Method了,也就是JS裡呼叫的GetContactName()。這邊的例子input是TextBox1.text,output則是TextBox1.text+系統時間。可以修改成透過TextBox1.text,撈DB相關資料後,Return到TextBox2上。要特別注意的是,需宣告成public static,且需要System.Web.Services.WebMethod的修飾語。

  1. [System.Web.Services.WebMethod]  
  2. public static string GetContactName(string TextBox1text)  
  3. {  
  4. return TextBox1text + System.DateTime.Now.ToString();  

Step7:接著在Page_Load()的時候,將Javascript的function注冊到TextBox1的onblur事件上。

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3. if (!Page.IsPostBack)  
  4. {  
  5. TextBox1.Attributes.Add("onblur", "CallMe('" + TextBox1.ClIEntID + "', '" + TextBox2.ClIEntID + "')");   
  6. }  

Step8:執行後,在TextBox1上輸入”Hello World !”,就會發現onblur之後,執行了server端的GetContactName(),而且畫面並未PostBack 。

其實,PageMethod的方式跟Web Service大同小異,不過省了參考asmx,也省了些檔案,還蠻適合特殊需求時使用。

用ClIEnt端Script呼叫Server端的Method,這我也是第一次使用,有錯誤或需要加強的地方,還望大家見諒。 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved