一ASPNET中的事件主要支持个主要的事件组
包含在生成页面时自动生成我们使用这些事件建立页面(如page_load等)
包含了用户与页面交互时发生的所有事件(这种最强大)
html内部的事件这些事件在浏览器上执行(主要是由javascript来实现)
在C#语言中事件的处理主要有两种方法
委托式事件处理模式(Delegation Event Model) (VS中需要手工建立事件的委托关系VS不需要了)
对可重载方法(Event Method)的重载 (在控件代码中重载方法)
二ASPNET服务端添加客户端事件
服务器控件并不是所有的操作都是在服务器端执行的有的事件是通过客户端脚本来执行的这样可以大大增强服务器控件的可用性如ASPNET验证控件可以把部分工作放在客户端进行验证
ASPNET服务器控件可以发送两种客户端脚本
客户端脚本块客户端脚本块通常是用JavaScript编写的其中通常包含在发生特定的客户端事件时执行的函数
发送脚本块的方法是使用SystemWebUIPage类包含的两个方法可以将客户端代码发送到由ASPNET Web页面提供的HTML中
()RegisterStartupScript(keyscript)在Web窗体的结尾处(在</form> 标记之前)发送脚本块
()RegisterClientScriptBlock(keyscript):在Web窗体的开始处(紧接着<form runat=server>标识之后)发送脚本块
如 protected override void OnPreRender(EventArgs e)
{
if (!PageClientScriptIsClientScriptBlockRegistered(Common))
{
PageClientScriptRegisterClientScriptBlock(typeof(Page) Common ClientJavaScriptCodeScipt(Commonjs));
}
if (!PageClientScriptIsClientScriptBlockRegistered(ScriptKey))
{
PageClientScriptRegisterClientScriptBlock(typeof(Page) ScriptKey ClientJavaScriptCodeScipt(DateTimejs));
}
}
客户端HTML属性客户端HTML属性提供将客户端事件与客户端脚本联系在一起的方法
这种方法只适用于从SystemWebUIWebControlsWebControl类导出的服务器控件因为从这个类导出的控件会发送某些HTML元素
WebControl类包含一个将HTML元素属性添加到由Web控件发出的HTML元素的方法该方法称为AddAttributesToRender()它只有一个输入参数即HtmlTextWriter的实例
当然在现在开发控件中也没必要通过这种方式来为HTML元素添加事件特别在采用AJAX模式的情况下完全可以在客户端通过$addHandler来为HTML元素绑定事件 /// <summary>
/// 将此控件呈现给指定的输出参数
/// </summary>
/// <param name=output> 要写出到的HTML 编写器</param>
protected override void AddAttributesToRender(HtmlTextWriter output)
{
outputAddAttribute(onmousedownsetday(this););
outputAddAttribute(onkeypress EnsureNumeric(event));
baseAddAttributesToRender(output);
}
下面的例子说明了ASPNET服务端如何添加客户端事件 using System;
using SystemData;
using SystemConfiguration;
using SystemCollections;
using SystemWeb;
using SystemWebSecurity;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIWebControlsWebParts;
using SystemWebUIHtmlControls;
namespace ServerToClientScript
{
public partial class _Default : SystemWebUIPage
{
protected void Page_Load(object sender EventArgs e)
{
string script = return confirm(真的要删除吗?);;
thisButtonAttributesAdd(onclickscript);
if ((!PageIsStartupScriptRegistered(PopUp)&&(!PageIsPostBack)))
{
string scriptBlock = <script language=JavaScript>alert(发送客户端脚本!);</script>;
PageRegisterStartupScript(PopUpscriptBlock);
}
}
}
}
三通过客户端事件引发服务端事件
其实服务端控件的服务端事件是通过客户端的JavaScript模拟出来的如我在页面上添加了一个服务器控件DropDownList并设置其AutoPostBack为True然后设置它的 SelectedIndexChanged事件 protected void DropDownList_SelectedIndexChanged(object sender EventArgs e)
{
}
运行页面后发现HTML代码为可以看出服务端SelectedIndexChanged事件模拟成JavaScript中的onchange事件
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN
transitionaldtd>
<html xmlns= >
<head><title>
无标题页
</title></head>
<body>
<form name=form method=post action=MNEventaspx id=form>
<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=/wEPDwULLTEODIMjgzNjcPZBYCAgMPZBYCAgEPEGRkFgFmZGSYTeyILmYps
yPH/GyUwiYstw== />
</div>
<script type=text/javascript>
<!
var theForm = documentforms[form];
if (!theForm) {
theForm = documentform;
}
function __doPostBack(eventTarget eventArgument) {
if (!theFormonsubmit || (theFormonsubmit() != false)) {
theForm__EVENTTARGETvalue = eventTarget;
theForm__EVENTARGUMENTvalue = eventArgument;
theFormsubmit();
}
}
// >
</script>
<div>
<select name=DropDownList onchange=javascript:setTimeout(__doPostBack(\DropDownList\\\) ) id=DropDownList>
<option selected=selected value=男>男</option>
<option value=女>女</option>
</select></div>
<div>
<input type=hidden name=__EVENTVALIDATION id=__EVENTVALIDATION value=/wEWBALgifCwDwKdI/lCgKUaSLBgLQuaSLBtnpaAhgqUhPSsiGZsieadh />
</div></form>
</body>
</html>
</html>
既然服务器端控件的事件是通过客户端的JavaScript模拟出来那么我们就可以通过客户端事件来引发服务器事件
在控件开发中控件的服务端事件就是通过客户端的JavaScript模拟出来的(__doPostBack)
如例子ClientToServerEvent(附件中有代码)
通过DropDownList的onchange客户端事件来引发服务端控件Button的服务端事件Click事件如 using System;
using SystemData;
using SystemConfiguration;
using SystemCollections;
using SystemWeb;
using SystemWebSecurity;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIWebControlsWebParts;
using SystemWebUIHtmlControls;
namespace ServerToClientScript
{
public partial class ClientToServerEvent : SystemWebUIPage
{
protected void Page_Load(object sender EventArgs e)
{
string strCMD = PageGetPostBackClientHyperlink(Button);
string script = @Javacript:ConfirmUpdate(EVAL_MESSAGE);;
script = scriptReplace(EVAL_MESSAGE strCMD);
DropDownListAttributesAdd(onchangescript);
}
protected void Button_Click(object sender EventArgs e)
{
ResponseWrite(我从服务器来已经保存!);
}
}
}
在页面上写JavaScript脚本
<script type=text/javascript>
function ConfirmUpdate(cmd)
{
if(confirm(真的要保存吗?))
{
eval(cmd); //eval函数调用一个字符串中包含的命令
}
else
{
alert(我来自客户端已经取消!);
}
}
</script>
这样当我的DropDownList选项改变时触发onchange客户端事件然后由该事件引发Button服务端事件
四ASPNET事件模型机制
ASPNET之所以对于以前的ASP是一个革命性的巨变在很大程度上是由于ASPNET技术是一种基于事件驱动的全新技术
在ASPNET中时间的触发和处理是在客户端和服务端进行的
ASPNET中如果频繁和服务器进行事件信息传递会大大降低服务器的处理效率和性能因而有些事件如OnMouseOver没有提供
但提供了Change事件为了提高效率它们被缓存在客户端等到再一次事件信息被发送到服务器端时一同发送回去
如文本框的change事件下拉框的change事件
如两个控件的change事件中 protected void DropDownList_SelectedIndexChanged(object sender EventArgs e)
{
ResponseWrite(DropDownList控件选择改变!<br>);
}
protected void TextBox_TextChanged(object sender EventArgs e)
{
ResponseWrite(TextBox文本改变!<br>);
}
如果控件本身的AutoPostBack设置为false(默认是false)时文本框和下拉框发生
改变时不会执行change事件的而是将事件信息缓存在客户端
当在页面上点击一个服务器端控件Button protected void Button_Click(object sender SystemEventArgs e)
{
ResponseWrite(点击了Button按钮!<br>);
}
此时将客户端中的事件信息发送到服务器端执行所有的事件返回到客户端的信息为
TextBox文本改变!
DropDownList控件选择改变!
点击了Button按钮!