邵志東的講座「ASP.NET中的事件處理」總結,總結了有一段時間了,一直放在本地,今天放上來。
1、ASP.NET中的事件主要支持3個主要的事件組:
一、包含在asp.net生成頁面時自動生成,咱們使用這些事件創建頁面(如page_load等)
二、包含了用戶與頁面交互時發生的全部事件(這種最強大)
三、html內部的事件,這些事件在瀏覽器上執行(主要是由javascript來實現)。javascript
在C#語言中,事件的處理主要有兩種方法:
一、委託式事件處理模式(Delegation Event Model) (VS2003中須要手工創建事件的委託關係,VS2005不須要了。)
二、對可重載方法(Event Method)的重載 (在控件代碼中重載方法)html
2、ASP.NET服務端添加客戶端事件:java
服務器控件並非全部的操做都是在服務器端執行的,有的事件是經過客戶端腳原本執行的,這樣能夠大大加強服務器控件的可用性。如ASP.NET驗證控件,能夠把部分工做放在客戶端進行驗證。瀏覽器
ASP.NET服務器控件能夠發送兩種客戶端腳本:
一、客戶端腳本塊:客戶端腳本塊一般是用JavaScript編寫的,其中一般包含在發生特定的客戶端事件時執行的函數。
發送腳本塊的方法是使用System.Web.UI.Page類包含的兩個方法能夠將客戶端代碼發送到由ASP.NET Web頁面提供的HTML中:
(1)、RegisterStartupScript(key,script):在Web窗體的結尾處(在</form> 標記以前)發送腳本塊。
(2)、RegisterClientScriptBlock(key,script):在Web窗體的開始處(緊接着<form runat="server">標識以後)發送腳本塊。
如:
緩存
1 protected override void OnPreRender(EventArgs e)
2 {
3 if (!Page.ClientScript.IsClientScriptBlockRegistered("Common"))
4 {
5 Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Common", ClientJavaScriptCodeScipt("Common.js"));
6 }
7 if (!Page.ClientScript.IsClientScriptBlockRegistered(ScriptKey))
8 {
9 Page.ClientScript.RegisterClientScriptBlock(typeof(Page), ScriptKey, ClientJavaScriptCodeScipt("DateTime.js"));
10 }
11 }服務器
1 /// <summary>
2 /// 將此控件呈現給指定的輸出參數。
3 /// </summary>
4 /// <param name="output"> 要寫出到的HTML 編寫器</param>
5 protected override void AddAttributesToRender(HtmlTextWriter output)
6 {
7 output.AddAttribute("onmousedown","setday(this);");
8 output.AddAttribute("onkeypress", "EnsureNumeric(event)");
9
10 base.AddAttributesToRender(output);
11 }asp.net
1using System;
2using System.Data;
3using System.Configuration;
4using System.Collections;
5using System.Web;
6using System.Web.Security;
7using System.Web.UI;
8using System.Web.UI.WebControls;
9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11
12namespace ServerToClientScript
13{
14 public partial class _Default : System.Web.UI.Page
15 {
16 protected void Page_Load(object sender, EventArgs e)
17 {
18 string script = "return confirm('真的要刪除嗎?');";
19 this.Button1.Attributes.Add("onclick",script);
20
21 if ((!Page.IsStartupScriptRegistered("PopUp")&&(!Page.IsPostBack)))
22 {
23 string scriptBlock = "<script language='JavaScript'>alert('發送客戶端腳本!');</script>";
24 Page.RegisterStartupScript("PopUp",scriptBlock);
25 }
26 }
27 }
28}ide
3、經過客戶端事件引起服務端事件:
其實服務端控件的服務端事件是經過客戶端的JavaScript模擬出來的,如我在頁面上添加了一個服務器控件DropDownList,並設置其AutoPostBack爲True,而後設置它的 SelectedIndexChanged事件
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{函數
}post
運行頁面後發現HTML代碼爲:能夠看出服務端SelectedIndexChanged事件模擬成JavaScript中的onchange事件。
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3<html xmlns="http://www.w3.org/1999/xhtml" >
4<head><title>
5 無標題頁
6</title></head>
7<body>
8 <form name="form1" method="post" action="MNEvent.aspx" id="form1">
9<div>
10<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
11<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
12<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
13<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE3ODI0MjgzNjcPZBYCAgMPZBYCAgEPEGRkFgFmZGSYTeyI45LmYps34yPH/GyUwiYstw==" />
14</div>
15
16<script type="text/javascript">
17<!--
18var theForm = document.forms['form1'];
19if (!theForm) {
20 theForm = document.form1;
21}
22function __doPostBack(eventTarget, eventArgument) {
23 if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
24 theForm.__EVENTTARGET.value = eventTarget;
25 theForm.__EVENTARGUMENT.value = eventArgument;
26 theForm.submit();
27 }
28}
29// -->
30</script>
31
32
33 <div>
34 <select name="DropDownList1" onchange="javascript:setTimeout('__doPostBack(\'DropDownList1\',\'\')', 0)" id="DropDownList1">
35 <option selected="selected" value="男">男</option>
36 <option value="女">女</option>
37
38</select></div>
39
40<div>
41
42 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBALgifCwDwKd5I/lCgKU4aSLBgLQuaSLBtn23paAhgqUhPSsi0GZsi57eadh" />
43</div></form>
44</body>
45</html>
46
47</html>
既然服務器端控件的事件是經過客戶端的JavaScript模擬出來,那麼咱們就能夠經過客戶端事件來引起服務器事件。
在控件開發中,控件的服務端事件就是經過客戶端的JavaScript模擬出來的(__doPostBack)
如例子ClientToServerEvent(附件中有代碼)
經過DropDownList的onchange客戶端事件來引起服務端控件Button的服務端事件Click事件,如:
1using System;
2using System.Data;
3using System.Configuration;
4using System.Collections;
5using System.Web;
6using System.Web.Security;
7using System.Web.UI;
8using System.Web.UI.WebControls;
9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11
12namespace ServerToClientScript
13{
14 public partial class ClientToServerEvent : System.Web.UI.Page
15 {
16 protected void Page_Load(object sender, EventArgs e)
17 {
18 string strCMD = Page.GetPostBackClientHyperlink(Button1,"");
19 string script = @"Javacript:ConfirmUpdate(""EVAL_MESSAGE"");";
20 script = script.Replace("EVAL_MESSAGE", strCMD);
21 DropDownList1.Attributes.Add("onchange",script);
22 }
23
24 protected void Button1_Click(object sender, EventArgs e)
25 {
26 Response.Write("我從服務器來,已經保存!");
27 }
28 }
29}
30
在頁面上寫JavaScript腳本:
1 <script type="text/javascript">
2 function ConfirmUpdate(cmd)
3 {
4 if(confirm("真的要保存嗎?"))
5 {
6 eval(cmd); //eval函數調用一個字符串中包含的命令
7 }
8 else
9 {
10 alert("我來自客戶端,已經取消!");
11 }
12 }
13 </script>
這樣當個人DropDownList選項改變時,觸發onchange客戶端事件,而後由該事件引起Button服務端事件。
4、ASP.NET事件模型機制
一、ASP.NET之因此對於之前的ASP是一個革命性的鉅變,在很大程度上是因爲ASP.NET技術是一種基於事件驅動的全新技術。
二、在ASP.NET中時間的觸發和處理是在客戶端和服務端進行的。
三、ASP.NET中,若是頻繁和服務器進行事件信息傳遞,會大大下降服務器的處理效率和性能,於是有些事件如OnMouseOver沒有提供;
四、但提供了Change事件,爲了提升效率它們被緩存在客戶端,等到再一次事件信息被髮送到服務器端時一同發送回去。
如文本框的change事件,下拉框的change事件,
如兩個控件的change事件中:
1 protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
2 {
3 Response.Write("DropDownList控件選擇改變!<br>");
4 }
5
6 protected void TextBox1_TextChanged(object sender, EventArgs e)
7 {
8 Response.Write("TextBox文本改變!<br>");
9 }