EVENTTARGET 、EVENTARGUMENT 和VIEWSTATE

__VIEWSTATE:页面状态信息在客户端的存储(ViewState中存储的信息, EnableViewState="true"的控件状态信息). __EVENTTARGET:页面回传触发事件 页面回传触发事件:__doPostBack('Button2','')表示调用按钮Button2在后端的所对应的单击事件 控件回传触发事件:__doPostBack('TEST1$Button1','')表示调用TEST1控件中的Button1按钮的Click方法 __EVENTARGUMENT:页面回传触发事件时所带的参数 如:__doPostBack('Button1','aa')在后端可以使用Request.Form["__EVENTARGUMENT"]来取得 .net自动生成的一些客户端的代码 用来回传数据和自己带的一些脚本函数 ===================================================================== function __doPostBack(eventTarget, eventArgument)的eventTarget参数是GridView控件的名字,eventArgument参数是命令字。当如果是删除时,eventArgument参数是Delete开头;当如果是插入时,eventArgument参数是Insert开头;当如果是编辑时,eventArgument参数是Edit开头;当如果是选择时,eventArgument参数是Select开头。 ============================================================ 客户端触发事件后调用__doPostBack方法,将表示触发的控件源的eventTarget 和事件参数eventArgument分别付给两个隐藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服务端根据 __EVENTTARGET和__EVENTARGUMENT来判断是哪个控件的什么事件触发了。 < script language="javascript">  function __doPostBack(eventTarget, eventArgument) {  var theform = document.WebForm2;  theform.__EVENTTARGET.value = eventTarget;  theform.__EVENTARGUMENT.value = eventArgument;  theform.submit();  }< /script> ================================================================= Asp.net的postback机制我们知道Asp.net输出到客户端时都会被转化为HTML,页面Render到Client后,Client的HTML代码将包含如下代码:

其中隐藏字段_EVENTTARGET代表触发事件的控件。_EVENTARGUMENT代表事件的额外参数。 为了页面能在PostBack后依然能读取服务器控件原有的状态数据,Asp.net中使用了ViewState技术,而ViewState技术本质上是用一个默认名称为__VIEWSTATE的Hidden类型表单域来保存和传递数据(这些数据是经过了序列化后Base64编码的字符串值)。控件的事件被Render后事件变成javascript:__doPostBack('Button1','')例如下面的样子当按钮被点击后,触发了__doPostBack事件,_doPostBack事件把表单提交给Server, Server端通过__EVENTTARGET这个hidden field的值找到对应的Server端的Control. 接下来Server查看Control是否实现调用Page的RaisePostBackEvent,这个函数的定义如下: protected virtual void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument) { sourceControl.RaisePostBackEvent(eventArgument); } 函数调用本控件内的protected virtual void RaisePostBackEvent(string eventArgument) { base.ValidateEvent(this.UniqueID, eventArgument); if (this.CausesValidation) { this.Page.Validate(this.ValidationGroup); } this.OnClick(EventArgs.Empty);this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument)); } OnCommand实现了你定义的控件的函数。 http://blog.csdn.net/yangzl2008/article/details/6723504

posted @ 2012-03-06 13:17  路灯下的诗人  阅读(839)  评论(0编辑  收藏  举报