__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代码将包含如下代码:
<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" />
不过,另外要注意的就是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 文件:
狀態:<asp:DropDownList ID="Ddl_Status" runat="server" AutoPostBack="true" onselectedindexchanged="Ddl_Status_SelectedIndexChanged">
<asp:ListItem></asp:ListItem>
<asp:ListItem Value="派工中">派工中</asp:ListItem>
<asp:ListItem Value="已完成">已完成</asp:ListItem>
</asp:DropDownList></td></tr>
<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>
在 index.aspx.cs 文件:
protected void Ddl_Status_SelectedIndexChanged(object sender, EventArgs e)
{
PG_DataBind(); //自定义的调用方法
}
__doPostBack 方法解析的更多相关文章
- __doPostBack方法解析 __VIEWSTATE __EVENTTARGET __doPostBack __EVENTARGUMENT
关于这个的另一篇博客:http://www.cnblogs.com/Silicon-Fado/archive/2009/04/21/1440437.html __VIEWSTATE:页面状态信息在客户 ...
- Python的方法解析顺序(MRO)[转]
本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...
- sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO
sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...
- iOS 详解NSXMLParser方法解析XML数据方法
前一篇文章已经介绍了如何通过URL从网络上获取xml数据.下面介绍如何将获取到的数据进行解析. 下面先看看xml的数据格式吧! <?xml version="1.0" enc ...
- 四种方法解析JSON数据
(1)使用TouchJSon解析方法:(需导入包:#import "TouchJson/JSON/CJSONDeserializer.h") //使用TouchJson来解析北京的 ...
- Method Resolution Order – Python类的方法解析顺序
在支持多重继承的编程语言中,查找方法具体来自那个类时的基类搜索顺序通常被称为方法解析顺序(Method Resolution Order),简称MRO.(Python中查找其它属性也遵循同一规则.)对 ...
- 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析
作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...
- 2019-2-20C#开发中常用加密解密方法解析
C#开发中常用加密解密方法解析 一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是 message-digest algorithm 5[|ˈmes ...
- C#中用DateTime的ParseExact方法解析日期时间(excel中使用系统默认的日期格式)
最近做的项目中服务器是英文的系统,系统需要通过excel的单元格导入日期,excel中的日期格式是系统默认的日期格式,如下图所示 以上日期格式,会跟着操作系统设置的日期格式相同例如我的中文系统的日期格 ...
随机推荐
- 将ojdbc 添加到maven
去oracle官网下载jar包 然后在jar包所在目录输入maven命令 mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdb ...
- iframe 子页面改变父页面样式
iframe 子窗口调节父窗口样式: $(window.parent.document).find("body").attr("style"," 父元 ...
- 移动端mate标签设置
<meta name="viewport" content="width=device-width,height=device-height,initial-sca ...
- Java 之数组(4)
什么是数组: 问:编写代码保存 4 名学生的考试成绩. 答:简单啊,定义 4 个变量呗 问:那“计算全年级 400 名学生的考试成绩”,肿么办 答: ....... 数组,就可以帮助你妥妥的解决问题啦 ...
- php模拟post提交
<?php $url = "xxxxx"; // 用户名 $loginName = ''; // 密码 $pwd = ''; // service $serviceName ...
- 微软Azure虚拟机备份服务在中国发布
近期,Azure虚拟机备份服务在微软智能云上发布. 相关功能阐述: Azure IaaS虚拟机备份服务针对Windows操作系统,提供了应用一致性的备份技术:同时针对Linux操作系统,提供了文件系统 ...
- C#调用Excel VBA宏[转载]
原文地址:https://www.cnblogs.com/heekui/archive/2008/03/30/1129355.html 近日的一系列工作是做网站的营运维护,因此做了大量的支持工具.有E ...
- 【Leetcode】【Medium】Search Insert Position
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- Tiled编辑器
TiledMap编辑器生成的是*.tmx文件,此文件可以直接被cocos2dx使用(CCTMXTiledMap类).lua代码如下: local map = CCTMXTiledMap:create( ...
- Python初学者第六天 列表操作练习
6day 列表练习: 1.创建一个空列表,命名为names,往里面添加old_drilver,rain,jack,shanshan,peiqi,black_girl: names = [] names ...