Snowberg

 

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代码将包含如下代码:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA0NDQ2OTE5OWRk281L4eAk7iZT10hzg+BeOyoUWBQ=" /> <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>

其中隐藏字段_EVENTTARGET代表触发事件的控件。_EVENTARGUMENT代表事件的额外参数。为了页面能在PostBack后依然能读取服务器控件原有的状态数据,Asp.net中使用了ViewState技术,而ViewState技术本质上是用一个默认名称为__VIEWSTATE的Hidden类型表单域来保存和传递数据(这些数据是经过了序列化后Base64编码的字符串值)。

控件的事件被Render后事件变成javascript:__doPostBack('Button1','')例如下面的样子

<input type="button" name="Button1" value="Button1" onclick="javascript:__doPostBack('Button1','')" id="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);    i

if (this.CausesValidation)  

 {      

  this.Page.Validate(this.ValidationGroup);

 }

this.OnClick(EventArgs.Empty);

this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument)); } OnCommand实现了你定义的控件的函数。

posted on 2011-08-26 21:55  Snowberg  阅读(638)  评论(0编辑  收藏  举报

导航