惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
G
Google Developers Blog
小众软件
小众软件
V
V2EX
月光博客
月光博客
腾讯CDC
aimingoo的专栏
aimingoo的专栏
J
Java Code Geeks
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
D
Docker
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI

博客园 - 尹合磊

用ObjectDataSource实现自定义分页的心得总结 如何:在 Calendar 控件中显示数据库中的选定日期 AddNew 方法创建可更新 Recordset 对象的新记录。 求一“从所有同类中排除某一类型”正则表达式? 按字节长度截取字符串(支持截取带HTML代码样式的字符串) ASP.NET2.0资料收藏 asp中通过一个全局方法来防止SQL注入式攻击 在一个JS文件中包含中文字符串,通过innerHTML输出后中文乱码? 解决TreeView中使用JavaScript完成CheckBox全选的办法 Yahoo邮箱POP、SMTP服务器设置详解 客户端触发Asp.net中服务端控件事件 marquee基本语法的全解释 SHTML 教程 SQL:以指定的次数重复字符表达式 JavaScript不间断连续图片滚动效果 Asp.net(C#)给图片加上水印效果 ASP.NET(C#)生成缩略图 ASP.NET中存取图片到数据库的示例 Data Access Application Block--使用存储过程,参数及事务
关于前台调用后台事件__doPostBack函数
尹合磊 · 2008-06-12 · via 博客园 - 尹合磊

    这里需要提一下的是,asp.net编程提供了服务端控件和客户端控件的说法,其实还是脱离不了HTML的本质,客户端和服务端需要交互必须要提交,提交有两种方式get和post,get就是通过向服务端发送连接地址,服务端通过地址的参数来获得信息的,一般这些参数都是明文,能在浏览器地址栏看到。而post是通过表单的input等元素提交到服务端的页面的,这些数据一般是看不到的。asp.net的服务端控件其实就是对一般的HTML控件做了个包装,大体是通过隐藏控件提供控制的参数的。 
这里介绍一个常用的函数_doPostBack,这个函数如果如果是ASP.Net render出来的页面就是自动产生这个函数,比如有带autopostback属性的控件,且其属性为true的页面,带编辑列的datagrid页面。 
__doPostBack是通过__EVENTTARGET,__EVENTARGUMENT两个隐藏控件向服务端发送控制信息的,__EVENTTARGET为要调用控件的名称,如果要调用的控件是子控件,用''$'或':'分割父控件:子控件,__EVENTARGUMENT是调用事件时的参数 
下面演示下如何调用后台事件: 
1.新建工程 
2.拖入一个服务端Button1,一个DropDownList1和一个客户端Button 
3.设置DropDownList1的AutoPostBack属性为True,Button1的Visible为False 
4.双击Button1,在事件里写下Response.Write("hello:" ); 
5.页面的HTML里找到客户端Button,写入onclick="__doPostBack('Button1','')" 
6.编译,运行,点击Button是不是出现了"Hello" 
7.查看源代码,发现里面多了下面行 
[复制此代码]CODE:
<script language="javascript">  
<!--  
function __doPostBack(eventTarget, eventArgument) {  
var theform;  
if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {  
theform = document.forms["Form1"];  
}  
else {  
theform = document.Form1;  
}  
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");  
theform.__EVENTARGUMENT.value = eventArgument;  
theform.submit();  
}  
// -->  
</script>

以及两个隐藏控件
[复制此代码]CODE:
<input type="hidden" name="__EVENTTARGET" value="" />  
<input type="hidden" name="__EVENTARGUMENT" value="" />


值得注意的是,_doPostPack的第一个参数是大小写不敏感的 
细心的人会发现,在__doPostBack里,提交调用的是theform.submit(),这样就导致对Form的onsubmit事件校验失效了,幸好这个问题在asp.net 2.0已经修复了。这里提供一个替换的解决办法,在Form的最下面插入下面的代码,这段代码在保证不管是不是render出来的页面均有效 
[复制此代码]CODE:
<script language="javascript"> 
<!-- 
function __doPostBack_Ex(eventTarget, eventArgument)  

var theform; 
if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) { 
theform = document.forms[0]; 

else { 
theform = document.forms[0]; 

if(!theform.__EVENTTARGET) 
{  
theform.appendChild(document.createElement("<input type='hidden' name='__EVENTTARGET'>")); 

if(!theform.__EVENTARGUMENT) 
{  
theform.appendChild(document.createElement("<input type='hidden' name='__EVENTARGUMENT'>"));  

theform.__EVENTTARGET.value = eventTarget.split("$").join(":"); 
theform.__EVENTARGUMENT.value = eventArgument; 
if ((typeof(theform.onsubmit) == "function"))  

if(theform.onsubmit()!=false) 

theform.submit();  


else 
{  
theform.submit();  

function __doPostBack(eventTarget, eventArgument) 

__doPostBack_Ex(eventTarget, eventArgument); 


// --> 
</script>

本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/9405.htm