__doPostBack

首先,很抱歉,没找到原文地址。


今天遇到了__doPostBack函数,在网上看到了很多关于__doPostBack使用的方法,但是感觉说法都有些出入,或者不清楚。因此也让我这个本来一向

喜欢引用别人东西的人忍不住要在自己的博客里面留下自己的一点原创了。。

言归正传,首先要记住这个函数的前面是两个下划线. __doPostBack= "_" + "_" + "doPostBack".

再介绍一下__doPostBack函数的作用。我们先来看一下_doPostBack函数的内容:

<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE4NDIzMDg2NDRkZMlHJoBQ9CYcWBtBK+zrfZzKoh/i" />
</div>

<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>
    <div>
上面这段是直接从含有自动回传功能控件的.net Web页面的HTML源代码里面粘帖过来的。

其中eventTarget 和eventArgument,是两个就是用来存储在回送的时候获取是哪个控件触发了回送,并且带了什么参数。总之,调用__doPostBack函

数可以实现客户端控件调用服务器端控件的响应。或者是在javascript里面调用.net的服务器控件事件。这一点可以充分用在子窗口调用父窗口中某

个服务器控件的服务器端的事件。

然后我们可以从LinkButton这个控件入手,分析一下 LinkButton的工作流程,就知道__doPostBack的使用方法了。因为微软的LinkButton就是使用

__doPostBack函数来达到使用客户端的控件来调用服务器端的函数的。

我们可以运行一个包含有LinkButton的aspx页面,查看他的源代码,发现关于LinkButton这个控件的代码竟然是一个超链接:

aspx中LinkButton的代码:
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">button1</asp:LinkButton>
在html中的源码中被翻译成了:
<a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">button1</a>

上面的代码可以明显的看出,LinkButton只不过就是一个超链接,他的链接就是执行javascript语句通过调用__doPostBack函数来调用服务器端的后

台代码的。因此,在有LinkButton的页面,会自动加上上面的__doPostBack函数。

但是在我们调用__doPostBack函数时,有些时候调用这个函数会出现"对象不存在"的脚本错误? 那是因为Html里面没有__doPostBack函数体,一般在

拖放那些有自动回传功能的控件时,当把他的autoPostback属性设为True,在运行的时候系统会自动添加__doPostback函数体,当然最直接的办法就

是添加一个LinkButton然后把其Text属性设为空,切记不要设Visible属性,因为如果Visible=false,在翻译成Html时,直接就忽略LinkButton的存

在了。


以前我 看到 许多关于 此函数的 用法。可是我一直没有成功过。也没有找到原因。

今天 ,突然 发现 我以前没有成功的原因。


那就是 __doPostBack('Button1','') 函数中的第一个参数 必须是控件的名字,就是Name属性的值 而不是 控件的ID!!


如网上 介绍说是:

function pCall()
{
__doPostBack('Button1','');
}

可以直接刷新页面,执行后台代码。 (控件名如果含有":" ,需要预先替换为"$")

即使控件设为隐藏,(如button的visible = false),页面上没有生成button, 仍然可以这样直接使用。


总结 说,此函数 用法要注意的地方太多,

第一, doPostBack 函数名,很特别,他的前面有两个 下划线。而且大小写要区分好。


第二, 第一个参数 必须用 控件的 name 而不是ID。

         控件名有个规律是一层一层的将父控件ID用$符号连接起来的。   
         MyDataGrid是DataGrid的ID,_ctl13是DataGridItem的ID,lbtnV1是这个linkbutton的ID。其实,通过查看源代码可以看出 来的。


第三, 第二个参数 是传给控件的Value值。

其实,第一个参数对应 Request.Form["__EVENTTARGET"]; 第二个参数对应 Request.Form["__EVENTARGUMENT"];


第四, 此函数是DOTNET 的服务器控件产生的。 所以要使用此函数,必须整个页面上至少要有一个控件 可以回传页面。有些控件 的autoPostBack

必须设为TRUE。


其实,dotnet 服务器控件 在页面上产生两个隐藏的控件
一个名为__EVENTTARGET 另一个名为__EVENTARGUMENT

第一个的值是触发事件的控件名

第二个的值是此控件所带的值




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值