一、asp.net中的事件主要支持3個主要的事件組:
1、包含在asp.net生成頁面時自動生成,我們使用這些事件建立頁面(如page_load等)
2、包含了用戶與頁面交互時發生的所有事件(這種最強大)
3、html內部的事件,這些事件在瀏覽器上執行(主要是由javascript來實現)。
在C#語言中,事件的處理主要有兩種方法:
1、委托式事件處理模式(Delegation Event Model) (VS2003中需要手工建立事件的委托關系,VS2005不需要了。)
2、對可重載方法(Event Method)的重載 (在控件代碼中重載方法)
二、ASP.NET服務端添加客戶端事件:
服務器控件并不是所有的操作都是在服務器端執行的,有的事件是通過客戶端腳本來執行的,這樣可以大大增強服務器控件的可用性。如ASP.NET驗證控件,可以把部分工作放在客戶端進行驗證。
ASP.NET服務器控件可以發送兩種客戶端腳本:
1、客戶端腳本塊:客戶端腳本塊通常是用Javascript編寫的,其中通常包含在發生特定的客戶端事件時執行的函數。
發送腳本塊的方法是使用System.Web.UI.Page類包含的兩個方法可以將客戶端代碼發送到由ASP.NET Web頁面提供的HTML中:
(1)、RegisterStartupScript(key,script):在Web窗體的結尾處(在</form> 標記之前)發送腳本塊。
(2)、RegisterClientScriptBlock(key,script):在Web窗體的開始處(緊接著<form runat="server">標識之后)發送腳本塊。
如:
PRotected override void OnPreRender(EventArgs e)
{
if (!Page.ClientScript.IsClientScriptBlockRegistered("Common"))
{
Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Common", ClientJavaScriptCodeScipt("Common.js"));
}
if (!Page.ClientScript.IsClientScriptBlockRegistered(ScriptKey))
{
Page.ClientScript.RegisterClientScriptBlock(typeof(Page), ScriptKey, ClientJavaScriptCodeScipt("DateTime.js"));
}
}
2、客戶端HTML屬性:客戶端HTML屬性提供將客戶端事件與客戶端腳本聯系在一起的方法。
這種方法只適用于從System.Web.UI.WebControls.WebControl類導出的服務器控件,因為從這個類導出的控件會發送某些HTML元素。
WebControl類包含一個將HTML元素屬性添加到由Web控件發出的HTML元素的方法,該方法稱為AddAttributesToRender(),它只有一個輸入參數,即HtmlTextWriter的實例。
當然在現在開發控件中,也沒必要通過這種方式來為HTML元素添加事件,特別在采用Ajax模式的情況下,完全可以在客戶端通過$addHandler來為HTML元素綁定事件。
/// <summary>
/// 將此控件呈現給指定的輸出參數。
/// </summary>
/// <param name="output"> 要寫出到的HTML 編寫器</param>
protected override void AddAttributesToRender(HtmlTextWriter output)
{
output.AddAttribute("onmousedown","setday(this);");
output.AddAttribute("onkeypress", "EnsureNumeric(event)");
base.AddAttributesToRender(output);
}下面的例子說明了ASP.NET服務端如何添加客戶端事件:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace ServerToClientScript
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string script = "return confirm('真的要刪除嗎?');";
this.Button1.Attributes.Add("onclick",script);
if ((!Page.IsStartupScriptRegistered("PopUp")&&(!Page.IsPostBack)))
{
string scriptBlock = "<script language='JavaScript'>alert('發送客戶端腳本!');</script>";
Page.RegisterStartupScript("PopUp",scriptBlock);
}
}
}
}
三、通過客戶端事件引發服務端事件:
其實服務端控件的服務端事件是通過客戶端的JavaScript模擬出來的,如我在頁面上添加了一個服務器控件DropDownList,并設置其AutoPostBack為True,然后設置它的 SelectedIndexChanged事件
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
}
運行頁面后發現HTML代碼為:可以看出服務端SelectedIndexChanged事件模擬成JavaScript中的onchange事件。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
無標題頁
</title></head>
<body>
<form name="form1" method="post" action="MNEvent.aspx" id="form1">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE3ODI0MjgzNjcPZBYCAgMPZBYCAgEPEGRkFgFmZGSYTeyI45LmYps34yPH/GyUwiYstw==" />
</div>
<script type="text/javascript">
<!--
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
// -->
</script>

<div>
<select name="DropDownList1" onchange="javascript:setTimeout('__doPostBack(/'DropDownList1/',/'/')', 0)" id="DropDownList1">
<option selected="selected" value="男">男</option>
<option value="女">女</option>
</select></div>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBALgifCwDwKd5I/lCgKU4aSLBgLQuaSLBtn23paAhgqUhPSsi0GZsi57eadh" />
</div></form>
</body>
</html>
</html>既然服務器端控件的事件是通過客戶端的JavaScript模擬出來,那么我們就可以通過客戶端事件來引發服務器事件。
在控件開發中,控件的服務端事件就是通過客戶端的JavaScript模擬出來的(__doPostBack)
如例子ClientToServerEvent(附件中有代碼)
通過DropDownList的onchange客戶端事件來引發服務端控件Button的服務端事件Click事件,如:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace ServerToClientScript
{
public partial class ClientToServerEvent : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string strCMD = Page.GetPostBackClientHyperlink(Button1,"");
string script = @"Javacript:ConfirmUpdate(""EVAL_MESSAGE"");";
script = script.Replace("EVAL_MESSAGE", strCMD);
DropDownList1.Attributes.Add("onchange",script);
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write("我從服務器來,已經保存!");
}
}
}
在頁面上寫JavaScript腳本:
<script type="text/javascript">
function ConfirmUpdate(cmd)
{
if(confirm("真的要保存嗎?"))
{
eval(cmd); //eval函數調用一個字符串中包含的命令
}
else
{
alert("我來自客戶端,已經取消!");
}
}
</script>
這樣當我的DropDownList選項改變時,觸發onchange客戶端事件,然后由該事件引發Button服務端事件。
四、ASP.NET事件模型機制
1、ASP.NET之所以對于以前的ASP是一個革命性的巨變,在很大程度上是由于ASP.NET技術是一種基于事件驅動的全新技術。
2、在ASP.NET中時間的觸發和處理是在客戶端和服務端進行的。
3、ASP.NET中,如果頻繁和服務器進行事件信息傳遞,會大大降低服務器的處理效率和性能,因而有些事件如OnMouSEOver沒有提供;
4、但提供了Change事件,為了提高效率它們被緩存在客戶端,等到再一次事件信息被發送到服務器端時一同發送回去。
如文本框的change事件,下拉框的change事件,
如兩個控件的change事件中:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
Response.Write("DropDownList控件選擇改變!<br>");
}
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
Response.Write("TextBox文本改變!<br>");
}如果控件本身的AutoPostBack設置為false(默認是false)時,文本框和下拉框發生
改變時,不會執行change事件的,而是將事件信息緩存在客戶端,
當在頁面上點擊一個服務器端控件Button,
protected void Button1_Click(object sender, System.EventArgs e)
{
Response.Write("點擊了Button按鈕!<br>");
}
此時將客戶端中的事件信息發送到服務器端,執行所有的事件,返回到客戶端的信息為:
TextBox文本改變!
DropDownList控件選擇改變!
點擊了Button按鈕!
具體例子代碼見附件。
ServerToClientScript.rar
新聞熱點
疑難解答