这里需要提一下的是,
asp.net
编程提供了服务端控件和客户端控件的说法,其实还是脱离不了
HTML
的本质,客户端和服务端需要交互必须要提交,提交有两种方式
get
和
post
。
get
就是通过向服务端发送连接地址,服务端通过地址的参数来获得信息的,一般这些参数都是明文,能在浏览器地址栏看到
。而
post
是通过表单的
input
等元素提交到服务端的页面的,这些数据一般是看不到的
。
asp.net
的服务端控件其实就是对一般的
HTML
控件做了个包装,大体是通过隐藏控件提供控制的参数的。
这里介绍一个常用的函数 _doPostBack ,这个函数如果是 ASP.Net render 出来的页面就是自动产生这个函数 ,比如有带 autopostback 属性的控件,且其属性为 true 的页面,带编辑列的 datagrid 页面。 __doPostBack 是通过 __EVENTTARGET , __EVENTARGUMENT 两个隐藏控件向服务端发送控制信息的。 __EVENTTARGET 为要调用控件的名称,如果要调用的控件是子控件,用 ''$' 或 ':' 分割父控件 : 子控件, __EVENTARGUMENT 是调用事件时的参数。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
这里介绍一个常用的函数 _doPostBack ,这个函数如果是 ASP.Net render 出来的页面就是自动产生这个函数 ,比如有带 autopostback 属性的控件,且其属性为 true 的页面,带编辑列的 datagrid 页面。 __doPostBack 是通过 __EVENTTARGET , __EVENTARGUMENT 两个隐藏控件向服务端发送控制信息的。 __EVENTTARGET 为要调用控件的名称,如果要调用的控件是子控件,用 ''$' 或 ':' 分割父控件 : 子控件, __EVENTARGUMENT 是调用事件时的参数。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
下面演示下如何调用后台事件:
1. 新建工程
2. 拖入一个服务端 Button1 ,一个 DropDownList1 和一个客户端 Button
3. 设置 DropDownList1 的 AutoPostBack 属性为 True , Button1 的 Visible 为 False
4. 双击 Button1 ,在事件里写下 Response.Write("hello:" );
5. 页面的 HTML 里找到客户端 Button ,写入 οnclick="__doPostBack('Button1' , '')"
6. 编译,运行,点击 Button 是不是出现了 "Hello"
7. 查看源代码,发现里面多了下面行
1. 新建工程
2. 拖入一个服务端 Button1 ,一个 DropDownList1 和一个客户端 Button
3. 设置 DropDownList1 的 AutoPostBack 属性为 True , Button1 的 Visible 为 False
4. 双击 Button1 ,在事件里写下 Response.Write("hello:" );
5. 页面的 HTML 里找到客户端 Button ,写入 οnclick="__doPostBack('Button1' , '')"
6. 编译,运行,点击 Button 是不是出现了 "Hello"
7. 查看源代码,发现里面多了下面行
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
<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>
<!--
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>
以及两个隐藏控件
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
值得注意的是, _doPostPack 的第一个参数是大小写不敏感的 。细心的人会发现,在 __doPostBack 里,提交调用的是 theform.submit() ,这样就导致对 Form 的 onsubmit 事件校验失效了,幸好这个问题在 asp.net 2.0 已经修复了。这里提供一个替换的解决办法,在 Form 的最下面插入下面的代码,这段代码在保证不管是不是 render 出来的页面均有效
【
用submit提交是不会触发onsubmit事件的,onsubmit是用submit按钮提交才触发
<form action="bb.asp" name="aa" οnsubmit="alert('aa')">
</form>
<SCRIPT LANGUAGE="JavaScript">
<!--
aa.submit();
//-->
</SCRIPT>
<form action="bb.asp" name="aa" οnsubmit="alert('aa')">
</form>
<SCRIPT LANGUAGE="JavaScript">
<!--
aa.submit();
//-->
</SCRIPT>
】
<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);
}
<!--
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>
// -->
</script>
转载于:https://blog.51cto.com/zhjjzhjj/605319