一、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>