asp.net中的AJAX編程-Ajax伺服器擴充

來源:互聯網
上載者:User

    AJAX伺服器擴充建立在ASP.NET2.0基礎之上,包括一組新的伺服器控制項和服務,用來類比用戶端Ajax行為。這個擴充並不遵循傳統意義上的Ajax模型,但回應程式式卻會給終端使用者提供這種假象。

1. ScriptManager

      首先上場的是ScriptManger控制項,它是Ajax頁的在大腦,也是架構中最重要的控制項。這個控制項在應用AJAX的頁面上都要存在。所以,一般來說,把這個控制項配置在母板頁上是個不錯的選擇。
      1.1 理解ScriptManager
          ScriptManger在頁面中聲明,那麼,就可以使用以下代碼獲得ScriptManager對象的引用

ScriptManager scriptManager  = ScriptManager.GetCurrent(this.page);

          ScriptManager的主要職責是向瀏覽器發布指令碼,它部署的腳 本可以來自ASP.NET AJAX庫、伺服器上的本地檔案、或其它程式集中的內嵌資源 。
          如果向頁面中增加了這個控制項,就會在頁面上添加Ajax功能所需要的指令碼。自動添加的指令碼如下所示:

<script src="/DawnEnterprise/ScriptResource.axd?d=ZYr5gMq5Wx2FWpVo0uv-BD-m-oowwmBICEBuKQwKOJhLEbbhej7v8HlVC3cT9q6GK5AIduL5twl1x9QabC7kBb8dwS_WS5k-Bt-8VVrMkv9mVZJQ2-d-i5UAnMs1K7lz0&amp;t=ffffffffc3daa407" type="text/javascript"></script>

          在一般的ASP.NET 2.0中,一個程式集中的內嵌資源需要通過WebResource.axd,並且經過HTTP處理常式訪問。關於WebResource,請看以下網頁:
                http://www.codeproject.com/KB/aspnet/MyWebResourceProj.aspx
                http://blog.joycode.com/ghj/archive/2008/01/14/113719.joy
          而在ASP.NET AJAX中,它被一個名為ScriptResource.axd的新 HTTP處理常式取代,它提供了一些額外功能,可以實現本地化的瀏覽器壓縮 。
          連結的URL帶了兩個參數,分別是d和t,d參數表示的經過編碼的資源鍵,t參數表示的是時間戳記,指是這個程式集最後一次修改時間。再次載入這個頁面,瀏覽器會識別這個參數,於是使用者要擷取 資源時不必再次下載,而是使用瀏覽器緩衝的內容。
     
    1.2 部署Javascript檔案
          ScriptManager控制項有一個屬性Scripts,其中包含的是ScriptReference對象的集合。可以在頁面上包含額外的指令檔。如下所示:

Ajax.ScriptManager
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
    <asp:ScriptReference Path="~/scripts/Script1.js" />
    <asp:ScriptReference Path="~/scripts/Script2.js" />
    <asp:ScriptReference Assembly="Demo" Name="Demo.SuperScript.js" />
</Scripts>
</asp:ScriptManager> 

   1.3 註冊服務
        處於Javascript檔案是AJAX編程的一個重要方面,不過,由Javascript訪問WEB服務來得到資料才是提供AJAX支援的關鍵。要利用AJAX架構得到WEB服務,必須為要建立本地WEB服務註冊一個服務引用
        ScriptManager有一個Services屬性,其中包含一個ServiceReference對象集合,ServiceReference對象就是一種註冊服務的機制,從而可以從Javascript訪問這些對象。在http://www.cnblogs.com/shipfi/archive/2009/10/25/1589561.html的2.4節中的例子就是一個典型的Javascript調用WebService的例子。
        以下代碼展示了如何使用ScriptManager註冊本地服務

Ajax.ScriptManager_ServiceReference
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
    <asp:ServiceReference Path="~/Services/MainService.asmx" />
    <asp:ServiceReference Path="~/Services/TestService.asmx" />
</Services>
</asp:ScriptManager>

 

2. ScriptManagerProxy

    一個頁面上有且只能有一個ScriptManager控制項,如果有多個ScriptManager控制項,則會導致頁面產生一個InvalidOperationException異常。不過在某些情況下,內容頁需要一個服務或者指令碼引用可能並非由父頁面或主版頁面中的ScriptManager建立,這些引用 可能只是某一個頁面需要,而其它的頁面不需要。在這種情況下,ScriptManagerProxy控制項就派上用場了。
    在某個頁面上使用ScriptManagerProcy保證指令碼只包含在本頁面上。

Ajax.ScriptManagerProxy
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
<Scripts>
    <asp:ScriptReference Path="~/scripts/DummyScript.js" />
</Scripts>
<Services>
    <asp:ServiceReference Path="~/Services/MainService.asmx" />
</Services>
</asp:ScriptManagerProxy> 

    與父控制項一樣,ScriptManagerProxy也有一個指令碼和服務引用集合,可以把ScriptManagerProxy認為是ScriptManager控制項的擴充。它的用途是增加ScriptManager所沒有包含的引用,使用主版頁面時這種情況很常見。

 

3.UpdatePanel控制項

    UpdatePanel控制項是一個Ajax的伺服器控制項,它與ScriptManager緊密合作,以對頁面應用部分頁面更新。
    UpdatePanel類的ContentTemplate屬性定義了頁面上動態更新的地區,如果使用UpdatePanel,不會導致一個常規的整個頁面回送並重新整理整個頁面。而會產生一個新型回送,即非同步回送(asynchronous postback). 非同步回送也會經過頁面的生命週期,其處理類似於常規回頭,但不會導致頁面重新整理,這意味著UI和應用邏輯可以保持不變。
     可以檢測測是否正在非同步回送的代碼:

Ajax.ScriptManger.IsInAsyncPostBack
protected void Page_Load(object sender, EventArgs e)
{
    ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);  // 返回ScriptManager執行個體
    if (scriptManager.IsInAsyncPostBack)  {  // 檢查非同步回送
         // We are doing something cool!
    }
} 4.UpdateProgress控制項

   在非同步回送時,如果處理時間比較長,可以通過這個控制項來告訴使用者正在資料轉送的過程中,可以顯示一個loading.畫面。其有一個AssociatedUpdatePanelID屬性,可以將它設定為相關的UpdatePannel,這樣,只有當相關的UpdatePanel非同步回送時,UpdateProgress控制項中的內容才會顯示出來。

5.Timer控制項

   這個控制項在用戶端建立一個計時器,它會以指定的間隔(單位毫秒)調用回送。一般來說,使用Timer控制項,放置在UpdatePannel外面,然後在UpdatePannel控制項中UPdateMode屬性為Conditional,並且給UpdatePanel增加一個Tiggers屬性,ControlId為Timer的ID,EventName為Tick。

6.錯誤處理

    一般的,常規回送期間出現錯誤,會在螢幕上顯示出棧軌跡和錯誤資訊。在這裡,非同步回送的時候,瀏覽器會把異常顯示在一個對話方塊中。
    對於普通使用者,顯示異常時的錯誤資訊不是很好的做法。所以ScriptManager控制項有一個AsyncPostBackError的事件,就提供一種方法,向使用者顯示對話方塊之間可以利用這個變更對話方塊中的文本。如下所示:

Ajax.Exception.AsyncPostBackError
protected void Genres_SelectedIndexChanged(object sender, EventArgs e)
{
    UpdateGenre();
    throw new Exception("Look out!");  // 非同步回送時,手動的拋出一個異常
}
protected void Page_Load(object sender, EventArgs e)
{
    ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
    // 指定AsyncPostBackError事件發生後,調用OnAsyncPostBackError處理
    scriptManager.AsyncPostBackError += new EventHandler<AsyncPostBackErrorEventArgs>(OnAsyncPostBackError); 
}
void OnAsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
{
   // 變更對話方塊的顯示文字,由"Look out!" –> "We're sorry, an unexpected error has occurred"
   ScriptManager.GetCurrent(this.Page).AsyncPostBackErrorMessage ="We're sorry, an unexpected error has occurred.";

    當然,這個方法也不夠完美,因為畢竟彈出對話方塊對使用者來說也不夠友好,所以可以使用發生異常回送錯誤時轉到指定的錯誤頁面。這種錯誤機制可以在web.config的customErrors部分配置:

<system.web>
    <customErrors mode="On|Off|RemoteOnly"defaultRedirect="ErrorPage.aspx"> </customErrors>
</system.web>

    以上,mode屬性設定為on,則重新導向到ErrorPage.aspx頁面中,如果設為off,則總是顯示棧軌跡。如果設為RemoteOnly,則一個遠程機器上的訪問才會將使用者重新導向到錯誤頁面。
    ScriptManager控制項也提供了一個屬性可以覆寫這個機制,預設的AllowCustomerErrorRedirect屬性設定為true.這個屬性會覆寫customErrors中的值,如果AllowCustomerErrorRedirect設定為false,則會出現異常時顯示對話方塊:

protected void Page_Load(object sender, EventArgs e)
{
    ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
    scriptManager.AllowCustomErrorsRedirect = false;
}

    AllowCustomErrorsRedirect必須要在Page_load時(或之前)設定,如果在load之後設定,則對customErros中的設定沒有影響 。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.