__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代码将包含如下代码:
<inputtype="hidden"name="__EVENTTARGET"id="__EVENTTARGET"value=""/> <inputtype="hidden"name="__EVENTARGUMENT"id="__EVENTARGUMENT"value=""/> <inputtype="hidden"name="__VIEWSTATE"id="__VIEWSTATE"value="/wEPDwUKMTA0NDQ2OTE5OWRk281L4eAk7iZT10hzg+BeOyoUWBQ="/> <scripttype="text/javascript"> <!-- vartheForm=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','')例如下面的样子
<inputtype="button"name="Button1"value="Button1"οnclick="javascript:__doPostBack('Button1','')"id="Button1"/>
当按钮被点击后,触发了__doPostBack事件,_doPostBack事件把表单提交给Server,Server端通过__EVENTTARGET这个hidden field的值找到对应的Server端的Control.接下来Server查看Control是否实现调用Page的RaisePostBackEvent,这个函数的定义如下:
protectedvirtualvoidRaisePostBackEvent(IPostBackEventHandlersourceControl,stringeventArgument) {
sourceControl.RaisePostBackEvent(eventArgument); }
函数调用本控件内的
protectedvirtualvoidRaisePostBackEvent(stringeventArgument) {
base.ValidateEvent(this.UniqueID,eventArgument);i
if(this.CausesValidation)
{
this.Page.Validate(this.ValidationGroup);
}
this.OnClick(EventArgs.Empty);
this.OnCommand(newCommandEventArgs(this.CommandName,this.CommandArgument)); } OnCommand实现了你定义的控件的函数。