熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

跳出封裝剖析ASP.NET腳本回調的原理

2013-11-13 10:08:07  來源: .NET編程 
    [注此段與標題內容無關可略過] 在看完兩集Stargate並且洗了一個澡之後我終於決定要開始寫這篇文章這是我第一篇真正意義上的原創技術文章不管技術含量如何我總算是邁出了這一步博客其實開過不少從最早的校園大巴到博客園以及我那個用來發牢騷的新浪博客其實開博客最初的目的就是用來在寫程序的同時記錄一下自己的學習的過程但是後來演變成了用來發牢騷的東西這也算是我一直以來不能專心鑽研的惡果吧不過所謂亡羊補牢為時未晚就從這篇文章開始變得專注一點再專注一點由這種專注的思想引導我最近終於又開始好好的寫程序這次是真的放下了那些不想干的東西專心致志的開始寫我喜歡的C#代碼在我所知道的編程語言裡面我最喜歡的是C#和javascript後者是種腳本語言准確地說j是我最近才喜歡上的我原來以為它也就同我小時候玩的Basic一般小巧也簡單但是事實證明不是這個樣子的雖然它和VBS一樣也是腳本語言但是在它C語言的外表之下其實隱藏著更多的內容這個我可能會寫另外的一篇文章來描述它現在切入正題我喜歡的NET平台不知道為什麼年的時候第一次使用C#語言寫代碼就覺得它很漂亮然後就愛上了他不過那個時候由於環境的問題所以一度中斷一直到了才又重新拾起來但是一年多的時候我也只是在拉著一堆堆的控件然後在屬性面板裡調整啊調整似乎忘記了Web原來有的樣子是怎麼樣的後來終於有一樣東西換起了我的回憶 Ajax

   到處都是Ajax開發框架其實在ASPNET 發布的時候內部其實就整合了一些類似的內容在一些數據控件比如GridView上面就有使用年一月份的MSDN Magazine中的一篇《Custom Script Callback in ASPNET》(中文版 | English)讓我認識到了 裡面異步調用的魅力(裡面的實現方法僅限於在beta版本中實現關於腳本回調部分betabeta以及正式版本之間都有所不同有興趣者可以自己參見最近發布的MSDN內容)不過當時也只是玩了一下後來使用Atlas也就對它沒怎麼上心不過前一段時間一個朋友和我討論實現ajax時講到atlas實現太過於繁瑣而他要實現的只是幾個非常小的內容不需要那麼麻煩由於我對除了這些之外的NET的ajax框架不熟悉所以自然而然的就想起了內置的腳本回調機制利用(經過他本人同意的)朋友的項目我們編寫了很多關於這個的代碼在寫完之後我突然發現了一個問題就是代碼太亂了每個頁面都是類似的東西而且只能傳遞一個字符串參數讓我們在除了交互方面對於一些大開銷的數據展示只好使用內嵌框架來實現了前兩天到海圖買了一本《Ajax 高級語言程序設計》看了一部分之後突然想搞明白 裡面的腳本回調又是如果實現的?其實現在轉回來頭看《Custom Script Callback in ASPNET》一文中很多地方已經講的很明白了可以無奈當時的水平很多東西看的都是雲裡霧裡的光顧者看效果了先貼一個我認為最簡潔的實現效果然後再進行剖析

   新建一個Defaultaspx的頁面在頁面上添加一個CheckBox控件然後打開Defaultaspxcs文件_Default類添加三個繼承的接口ICallbackContainerICallbackEventHandler和INamingContainer
  
  [代碼]
  
  #region ICallbackContainer 成員
  public string GetCallbackScript(IButtonControl buttonControl string argument)
  {
   throw new Exception(The method or operation is not implemented);
  }
  #endregion
  
  #region ICallbackEventHandler 成員
  string temp;
  
  public string GetCallbackResult()
  {
   //throw new Exception(Sample Error);
   return temp;
  }
  
  public void RaiseCallbackEvent(string eventArgument)
  {
   temp = _____ + eventArgument + is succeed_____;
  }
  #endregion
  
  
  轉到Defaultaspxcs頁面的Page_Load方法中加入下面代碼
  
  
  [代碼]
  proected void Page_Load(object sender EventArgs e)
  {
   string temp = PageClientScriptGetCallbackEventReference(this arg Callback context OnError true);
   string script = function CallServer(argcontext){ + temp + };
   PageClientScriptRegisterClientScriptBlock(thisGetType() abc script true);
   CheckBoxAttributesAdd(onclick CallServer(I call Server context););
  }
  
  在編輯完CS代碼之後打開Defaultaspx文件在<head></head>之間加入下列代碼
  
  
  [代碼]
  <script type=text/javascript>
  function OnError(errcontext)
  {
   alert(err);
  }
  
  function Callback(argcontext)
  {
   alert(arg);
  }
  </script>
  
  
   這裡的CheckBox控件是隨便拉上去的有需要可以隨便更改不過用Button控件的時候可能要注意一下它默認就會激活OnSubmit事件所以可能要設置或是直接使用HTML控件就好了以上的代碼算是腳本回調最小化的實現都是必須的缺一不可

   使用基本回調的控件必須實現三個接口分別是ICallbackContainerINamingContainer和ICallbackEventHandler其實INamingContainer沒有需要實現的接口內容它只是標識在 Page 對象的控件層次結構內創建新 ID 命名空間的容器控件(引自MSDN)至於ICallbackContainer這個接口在MSDN(中文版本)裡面給出的解釋比較模糊相關聯的一些文章也都是介紹腳本回調和ICallbackEventHandler接口的因為我們這裡是用頁面作為回調的基礎所以沒有使用這個接口要實現的方法GetCallbackScript但是如果是封裝自己的Ajax控件那這個方法就十分有用了這裡我們只是用了ICallbackEventHandler實現的方法來處理數據因為在Page_Load方法中我注冊了一個CallServer的方法然後依附於CheckBox的OnClick事件上觸發這樣我們就可以看法一個比較清晰的調用過程了

   後面[代碼]我實現了兩個Javascript方法一個是用來處理調用出錯的另外一個就是用來處理調用成功之後處理返回信息的了在[代碼]裡面有一段拋出異常的代碼被我注釋掉了通過這句代碼就可以模擬調用OnError方法了

   一直到這裡我們都是看到的實現這個調用是怎麼樣的說白了這其實算是一種比價高級的拖控件的方式但是它到底是怎麼實現的呢?為什麼我沒有看到任何有關於XmlHttpRequest的內容呢?(我堅信這是實現Ajax最好的方法因為這段代碼在任何支持Javascript浏覽器上都可以使用我想應該不會和暗門有關系吧)
From:http://tw.wingwit.com/Article/program/net/201311/12659.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.