ASP.NET實用技巧

來源:互聯網
上載者:User

本文主要介紹ASP.NET編程中的一些常用方法,內容涉及代碼技巧、效能最佳化等方面。

      1.跟蹤頁面執行
      設定斷點是頁面調試過程中的常用手段,除此之外,還可以通過查看頁面的跟蹤資訊進行錯誤排查以及效能最佳化。ASP.NET中啟用頁面跟蹤非常方便,只需在Page指令中加入Trace="True"屬性即可:

<%@ Page Language="C#" Trace="true">

      跟蹤資訊可以分為兩類:
      a.頁面執行詳細情況
      其中主要包括頁面生命週期中各事件列表、控制項樹列表(可以查看每個控制項的HTML位元組數以及ViewState位元組數)、Session狀態、Application狀態、Cookie集合、QueryString集合、伺服器變數等資訊。
      b.自訂跟蹤資訊
      通過在頁面代碼中調用Trace.Write()或Trace.Warn()方法便可將指定內容寫入跟蹤資訊中的"Trace Information"節。就算頁面發生了錯誤,跟蹤資訊還是會顯示出來,並且在發布應用程式時無需刪除相關的跟蹤代碼,只需從Page指令中移除Trace屬性即可。


      2.在伺服器端控制項中添加用戶端屬性
      我們有時會向伺服器端控制項中添加一些特殊的屬性,這類屬性不需要伺服器端的處理,只需簡單的發送至用戶端即可,我們不妨稱其為用戶端屬性,例如HTML 屬性或自訂屬性(可能用於實現某種特定的JavaScript功能)。可以通過以下幾種方法達到這個目的:
      a.直接向控制項添加用戶端屬性

<asp:Button ID="MyButton" Text="ClickMe" onmouseover="this.style.cursor='pointer'" runat="server" />

      其中的onmouseover是用戶端屬性,注意,編譯器是允許這種寫法的,但會顯示警告。
      b.調用內建方法
      可以通過調用WebControl.Attributes.Add()方法為控制項添加用戶端屬性,如下所示:

MyButton.Attributes.Add("onmouseover", "this.style.cursor='pointer'");

      這也是最常用的方法。
      c.建立自訂控制項
      如果某個類型的伺服器端控制項中經常需要添加用戶端屬性,則可以考慮建立一個繼承自該伺服器端控制項的自訂控制項,其中包含特定的用戶端屬性。
      正是考慮到這一點,ASP.NET 2.0中為按鈕控制項(包括Button、LinkButton、ImageButton控制項)提供了OnClientClick屬性,可以這樣寫:

MyButton.OnClientClick = "alert('Hello!')";

      真是貼心的功能!

      3.表單資料的伺服器端驗證
      將資料驗證任務從伺服器端遷移到用戶端的過程促使了JavaScript的產生,這也是我們沿用至今的一種方式。但只有在保證用戶端JavaScript正常啟動並執行前提下,這種方式才能發揮其作用。不幸的是,總有一些例外,比如瀏覽器不支援JavaScript,或者使用者刻意關閉了瀏覽器的JavaScript功能,這就導致了第一重防護失效。比較保險的做法是加入第二重防護,即對使用者提交的資料進行伺服器端驗證,但這無疑將增加開發人員的工作量。
      ASP.NET 2.0提供了一系列表單資料驗證控制項,可以非常輕鬆的完成用戶端及伺服器端的雙重資料驗證任務。但要使伺服器端驗證功能發揮作用,還需要用到Page.IsValid屬性,請看下面的例子:

<form id="MyForm" runat="server">
  <div>
    姓名:<asp:TextBox ID="txtName" runat="server"></asp:TextBox>&nbsp;<asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="txtName" ErrorMessage="請填寫姓名!" Display="Dynamic" runat="server"></asp:RequiredFieldValidator>
  </div>
  <div>
    <asp:Button ID="btnSubmit" Text="提交" runat="server" />
  </div>
</form>

      這是一個HTML片段,其中有一個RequiredFieldValidator控制項用於檢查是否已填寫姓名。下面是點擊按鈕時執行的伺服器端代碼:

protected void btnSubmit_Click(object sender, EventArgs e)
{
this.style.display='none'; document.getElementById('Codehighlighter1_59_173_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_59_173_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_59_173_Closed_Text').style.display='inline';
}" alt="" src="http://kb.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top">{
this.style.display='none'; document.getElementById('Codehighlighter1_59_173_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_59_173_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_59_173_Open_Text').style.display='inline';
}" alt="" src="http://kb.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">{
    if (Page.IsValid) //注意:不要遺漏對Page.IsValid屬性的判斷
{
this.style.display='none'; document.getElementById('Codehighlighter1_115_171_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_115_171_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_115_171_Closed_Text').style.display='inline';
}" alt="" src="http://kb.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top">{
this.style.display='none'; document.getElementById('Codehighlighter1_115_171_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_115_171_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_115_171_Open_Text').style.display='inline';
}" alt="" src="http://kb.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">    {
        Response.Write("你的名字是:" + txtName.Text);
    }
}

      其中,要特別注意對Page.IsValid屬性的判斷,只有頁面中所有驗證控制項對資料的驗證都成功時,Page.IsValid屬性才為True,這代表提交的資料為有效資料,可以進入下一步操作。

      4.跳過表單驗證
      在某些情況下,我們需要跳過表單中所有控制項的驗證,然而在另外一些情況下,我們卻希望有選擇的觸發表單中某些控制項的驗證功能。分別來看看這兩種情況:
      a.跳過所有驗證
      假設有個表單,其中除了各種資料錄入控制項外還有兩個按鈕,一個是提交按鈕,另一個是取消按鈕,同時表單中還有一些資料驗證控制項。我們希望當點擊取消按鈕的時候無需驗證表單中資料的有效性,而是直接將頁面提交至伺服器並將其重新導向到某個指定頁面。
      要實現這個功能,可以利用按鈕控制項(包括Button、LinkButton、ImageButton控制項)的CausesValidation屬性,將該屬性設為false即可跳過表單中的所有驗證。
      b.觸發某些驗證
      假設有個表單,被劃分成兩個功能區,一個用於使用者登入,另一個用於使用者註冊,我們希望當點擊登入按鈕時只觸發登入區的資料驗證,當點擊註冊按鈕時只觸發註冊區的資料驗證。
      解決辦法是將相關的資料驗證控制項和資料提交控制項(按鈕控制項)加入同一個驗證組,這一點是通過將各相關控制項的ValidationGroup屬性設定成相同的值來實現的。

      5.保持捲軸位置
      假設有個頁面,其中以列表形式顯示了一些資料記錄,每次編輯其中的記錄時都需要向伺服器提交頁面,為了提供良好的使用者體驗,我們希望每次編輯一條記錄並儲存後,捲軸位置都能保持不變。傳統的做法是每次提交頁面時將當前捲軸所在位置資訊按某種方式(Hidden欄位或QueryString)傳給伺服器端,當頁面返回用戶端時,由伺服器端根據傳入的位置資訊以JavaScript形式重新設定捲軸位置。
      如果通過ASP.NET來實現這一功能將變得非常簡單,只需在Page指令中加入MaintainScrollPositionOnPostback="true"屬性即可:

<%@ Page Language="C#" MaintainScrollPositionOnPostback="true">

 
     6.禁用不必要的ViewState

      在ASP.NET的運行機制中,ViewState起著重要的作用。ViewState經過編碼後存入表單Hidden欄位,每當頁面回傳至伺服器時再進行解碼。因此,ViewState的使用會帶來兩個問題:頻寬的佔用以及計算資源的消耗。好在不是所有控制項都需要啟用ViewState,我們完全可以禁用不必要的ViewState。
      ViewState預設是開啟的,需要手動關閉:
      a.禁用頁面ViewState
      在Page指令中加入EnableViewState="false"屬性即可:

<%@ Page Language="C#" EnableViewState="false">

      加入這個屬性後,整個頁面以及其中的所有控制項都將無法使用ViewState,因此需謹慎使用。
      b.禁用控制項ViewState
      這是推薦的方式,將控制項的EnableViewState屬性設為False即可禁用其ViewState,這裡有個簡單的竅門:
      如果某個控制項的狀態不能由操作者改變,則可以禁用其ViewState。最典型的莫過於Label控制項了,只能顯示資訊,無法操作。
      但TextBox、DorpDownList等控制項的狀態是可以改變的(通過輸入、選擇等操作),因此保留他們的ViewState還是有用的。

相關文章

聯繫我們

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