老貓的ASP.NET學習總結

來源:互聯網
上載者:User
一、ASP.NET頁面的處理順序

    ASP.NET頁面是由事件來驅動的,首先執行的是Init事件,在代碼中,系統自動增加了一個OnInit的重載函數,從而在頁面Init的時候就執行這個OnInit函數。在這個函數中,會執行InitializeComponent函數,這個函數裡就有很多控制項事件的代理函數,展開一個頁面的"Web Form Designer Generated Code",我們就可以看見這些。
    頁面在執行完Init之後,就是Load事件,對應的代碼就是Page_Load。
    然後就是引起頁面返回的事件的代碼,當然,如果頁面是第一次啟動並執行話,就沒有這一步了。
    也就是說,頁面每次重新整理的時候都會執行Page_Load函數,這也就是為什麼有些代碼要寫在

程式碼:       if (!Page.IsPostBack)
       { ... }

    中的原因。比如有一個文字框,如果在Page_Load中設定初始值,放在哪兒呢?如果放在if外面,那每次重新整理的時候都會執行這個指派陳述式,即使在頁面中修改了文字框的值,在返回之後仍然會消失,但是如果放在if之中,那就可以了,返回之後文字框中仍然是先前的值。
    很多朋友的DataGrid無法擷取編輯後的值,也可能就是這個原因。

二、javascript在頁面中的應用

    雖然ASP.NET採用新的運行機制,但是最後產生的還是能被一般瀏覽器識別的HTML和javascript代碼。
    在頁面中,仍然可以通過Response.Write來寫出一段JS代碼,比如要彈出一個新的瀏覽器視窗,可以用Response.Write(@"<script language=javascript>window.open('url');</script>");
    在Web控制項中,Attributes屬性集合也和JS聯絡緊密。新增加的一個Attributes元素就對應Web控制項最後產生的HTML代碼的一個屬性或者事件。
    比如有一個TextBox,要求我們在它獲得焦點的時候選中全部的文本,我們就可以這樣處理:TextBox1.Attributes["onFocus"]="javascript:this.select();";通過在IE中查看頁面的原始碼,我們可以看到這樣的一段:<input type=text onFocus="javascript:this.select();"...>,至於是什麼意思就不用我解釋了吧。
    另外還有一個應用,如果有一個Button,它的Click事件中有很多對資料庫的一些操作,我們要求使用者在按了這個Button之後確認一次(這有點想ASP中的MsgBox),現在我們就可以這樣處理:Button1.Attributes["onClick"]="javascript:return confirm('Are your sure...');";最後的效果如我們想像。
    註:以上代碼在CodeBehind中運行通過。至於代碼與頁面混在一起的情況,在書寫的時候可能會有所不同。

三、關於代碼重用

    ASP.NET已經基本轉向了OO的層面上來,其中的代碼基本都是通過類來執行的。就像我們寫C/S系統一樣,用一個或者多個Class來儲存公用的函數,然後再在其他函數中調用。
    還有一個方法就是寫到一個基類裡,其他類繼承這個基類。至於用那種方法,那看個人愛好以及函數的處理範圍。
    我前段事件做的一個項目是這樣做的,有兩個基類,一個是中介層的基類,一個是頁面Class的基類(繼承System.Web.UI.Page)。然後把一些資料庫的處理放到前一個基類裡,把頁面控制項的一些常用操作放到後一個基類裡。

四、Web控制項

    有幾個控制項是我們應該有很深的理解的:DataGrid、DataList。這兩個控制項在顯示資料上為我們提供了極大的方便,它們的各種用法,需要我們在實踐中不斷摸索、不斷總結。
    另外,自訂控制項也是一個比較重要的範圍。
    在自訂控制項的類型選擇上,如果你只是一般的顯示一些固有的控制項,而不作屬性、事件的操作,那寫成User Control會簡單一點,這樣的自訂控制項相當於ASP中通過include執行的代碼。如果你想在設計、運行中修改控制項內部的屬性、得到控制項的某些事件,那最好寫成一個dll檔案,也就是寫成一個類,這樣的控制項可以像一般的Web控制項一樣,用滑鼠拖動大小,設定屬性,擷取事件等。

允許 ASP.NET 伺服器控制項在 Page 中發出用戶端指令碼塊。

[Visual Basic]

程式碼:Overridable Public Sub RegisterClientScriptBlock( _
   ByVal key As String, _
   ByVal script As String _
)

[C#]

程式碼:public virtual void RegisterClientScriptBlock(
   string key,
   string script
);

[C++]

程式碼:public: virtual void RegisterClientScriptBlock(
   String* key,
   String* script
);

[JScript]

程式碼:public function RegisterClientScriptBlock(
   key : String,
   script : String
);

參數               備忘
key                標識指令碼塊的唯一鍵。 
script              發送到用戶端的指令碼的內容。 

在 Page 對象的 <form runat= server> 元素的開始標記後立即發出用戶端指令碼。發出指令碼塊時已定義了呈現輸出的對象,因此必須包括 <script> 元素的兩個標記。

通過使用關鍵字標識指令碼,多個伺服器控制項執行個體可以請求該指令碼塊,而不用將其發送到輸出資料流兩次。

具有相同 key 參數值的任何指令碼塊均被視為重複的。

注意   請記住在指令碼周圍加入 HTML 注釋標記,以便在請求的瀏覽器不支援指令碼時指令碼不會呈現。

樣本
[Visual Basic, C#] 下面的樣本說明如何將 RegisterClientScriptBlock 方法與 IsClientScriptBlockRegistered 配合使用。如果尚未註冊用代碼聲明塊編寫的 ECMAScript(如 IsClientScriptBlockRegistered 測試的那樣),則將發出 RegisterClientScriptBlock 調用。

[Visual Basic] 

程式碼:<html>
  <head>
     <script language="VB" runat="server">
   Sub Page_Load( sender as Object,e as EventArgs) 
       
      'Form the script that is to be registered at client side.
       Dim scriptString as String = "<script language=javascript> function DoClick() {"
       scriptString += "myForm.show.value='Welcome to Microsoft .NET'}<"
       scriptString += "/"
       scriptString += "script>"
      
            If(Not IsClientScriptBlockRegistered("clientScript"))
      RegisterClientScriptBlock("clientScript", scriptString)
       End If
    End Sub
     </script>
  </head>
  <body topmargin="20" leftmargin="10">
    <form id="myForm" runat="server">
      <input type="text" id="show" style="width=200">
      <input type="button" value="ClickMe" onclick="DoClick()">
    </form>
  </body>
</html>

[C#] 

程式碼:<html>
  <head>
    <script language="C#" runat="server">

    public void Page_Load(Object sender, EventArgs e) {

      // Form the script that is to be registered at client side.
      String scriptString = "<script language=javascript> function DoClick() {";
      scriptString += "myForm.show.value='Welcome to Microsoft .NET'}<";
      scriptString += "/";
      scriptString += "script>";

           if(!this.IsClientScriptBlockRegistered("clientScript"))
             this.RegisterClientScriptBlock("clientScript", scriptString);
    }

     </script>
  </head>
  <body topmargin="20" leftmargin="10">
    <form id="myForm" runat="server">
      <input type="text" id="show" style="width=200"> <input type="button" value="ClickMe" onclick="DoClick()">
    </form>
  </body>
</html>

相關文章

聯繫我們

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