__doPostBack 方法解析

function __doPostBack(eventTarget, eventArgument)的eventTarget参数是引起回送的控件的ID,eventArgument参数是回调参数(与控件相关的附加数据)。

当如果是删除时,eventArgument参数是Delete开头;当如果是插入时,eventArgument参数是Insert开头;当如果是编辑时,eventArgument参数是Edit开头;当如果是选择时,eventArgument参数是Select开头。 

客户端触发事件后调用__doPostBack方法,将表示触发的控件源的eventTarget和事件参数eventArgument分别付给两个隐藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服务端根据__EVENTTARGET和__EVENTARGUMENT来判断是哪个控件的什么事件触发了。

 

只有两个Web Server Control会自己触发页面的PostBack, 其它的所有控件都是通过__doPostBack函数触发页面的PostBack,页面解析时回将该类生成一个__doPostBack(eventTarget, eventArgument)方法。这两个参数分别由隐藏的两个表单域__ EVENTTARGET和__ EVENTARGUMENT保存。使用这两个隐藏的表单可以查找引起页面回送的控件ID和回送时的参数。然后就可以在后台用Request.Form["__EVENTTARGET"]和Request.Form["__EVENTARGUMENT"]取得控件ID和参数。当你触发__doPostBack事件时,遍历this.Request.Form.AllKeys,你查看到这两个隐藏的表单。

 

__VIEWSTATE:页面状态信息在客户端的存储(ViewState中存储的信息, EnableViewState="true"的控件状态信息).
__EVENTTARGET:页面回传触发事件 页面回传触发事件:

__doPostBack('Button2','')表示调用按钮Button2在后端的所对应的单击事件控件回传触发事件:

__doPostBack('TEST1$Button1','')表示调用TEST1控件中的Button1按钮的Click方法
__EVENTARGUMENT:页面回传触发事件时所带的参数 如:__doPostBack('Button1','aa')在后端可以使用Request.Form["__EVENTARGUMENT"]来取得
.net自动生成的一些客户端的代码用来回传数据和自己带的一些脚本函数。

 

Asp.net的postback机制我们知道Asp.net输出到客户端时都会被转化为HTML,页面Render到Client后,Client的HTML代码将包含如下代码:

 1 <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
 2 
 3  <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
 4 
 5  <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA0NDQ2OTE5OWRk281L4eAk7iZT10hzg+BeOyoUWBQ=" />
 6 
 7  <script type="text/javascript">
 8 
 9  var theForm = document.forms['form1']; 
10  if (!theForm)
11 
12  {
13 
14     theForm = document.form1;
15 
16  }
17 
18 
19  function __doPostBack(eventTarget, eventArgument)
20 
21  {
22 
23  if (!theForm.onsubmit || (theForm.onsubmit() != false))
24 
25  {
26 
27   theForm.__EVENTTARGET.value = eventTarget;
28 
29   theForm.__EVENTARGUMENT.value = eventArgument;
30 
31   theForm.submit();
32 
33   }
34 
35  } 
36 </script>

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

例如下面的样子

1 <input type="button" name="Button1" value="Button1" onclick="javascript:__doPostBack('Button1','')" id="Button1" />

不过,另外要注意的就是asp.net的webcontrols中,Button和ImgButton是异类,它们不是利用__doPostBack来实现postback的。为什么这样,可能因为Button在html中本来就是有触发submit事件的功能吧。asp.net不过是要令原来html中一些不能触发submit的东西submit,才弄出了__doPostBack来实现。对于原来就能submit的Button,又何必多此一举呢。

如上写法可以在后台找到Button。为什么这样? 不知道, 在Button的提交过程中,Button会将Button本身的ID作为Request.Form的一个Key,它的Value是Button的Text属性值,回传给服务器。所以可以在后台循环Form.Keys取到所提交的Button,以执行相应的函数.ImgButton也差不多,不同就在于,它不是用ImageButton的ID作为Request.Form的Key,它是用ImageButton的ID加上.x和.y作为Key,在Request.Form添加两上键值对,这两个键值应该是对应ImageButton的图片大小的,了解了这个规律后,我们仍然可以通过一定的方式得到是否是由ImageButton引发的PostBack。

 

例子:

下拉列表触发PostBack

在 index.aspx 文件:

1 狀態:<asp:DropDownList ID="Ddl_Status" runat="server" AutoPostBack="true" onselectedindexchanged="Ddl_Status_SelectedIndexChanged">
2      <asp:ListItem></asp:ListItem>
3      <asp:ListItem Value="派工中">派工中</asp:ListItem>
4      <asp:ListItem Value="已完成">已完成</asp:ListItem>
5      </asp:DropDownList></td></tr>
 1 <script type="text/javascript">
 2 var theForm = document.forms['form1'];
 3 if (!theForm) {
 4     theForm = document.form1;
 5 }
 6 function __doPostBack(eventTarget, eventArgument) {
 7     if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
 8         theForm.__EVENTTARGET.value = eventTarget;
 9         theForm.__EVENTARGUMENT.value = eventArgument;
10         theForm.submit();
11     }
12 }
13 </script>

 在 index.aspx.cs 文件:

1  protected void Ddl_Status_SelectedIndexChanged(object sender, EventArgs e)
2  {    
3     PG_DataBind();  //自定义的调用方法
4  }

 

posted on 2018-06-26 11:27  空空Ryan  阅读(4646)  评论(0编辑  收藏  举报

导航