关于前台调用后台事件__doPostBack函数

关于前台调用后台事件__doPostBack函数

这里需要提一下的是,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,写入οnclick="__doPostBack('Button1','')"
6.编译,运行,点击Button是不是出现了"Hello"
7.查看源代码,发现里面多了下面行


程序代码 程序代码



<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>



以及两个隐藏控件

程序代码 程序代码


<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />



值得注意的是,_doPostPack的第一个参数是大小写不敏感的

细心的人会发现,在__doPostBack里,提交调用的是theform.submit(),这样就导致对Form的onsubmit事件校验失效了,幸好这个问题在asp.net 2.0已经修复了。这里提供一个替换的解决办法,在Form的最下面插入下面的代码,这段代码在保证不管是不是render出来的页面均有效
程序代码 程序代码


<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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 ASP.NET UpdatePanel 的简单示例,其中触发器为文本框失去焦点,调用 TextBox1_TextChanged 函数,更改 Label1 的内容: ``` <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <!-- UpdatePanel 中的内容 --> <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" OnTextChanged="TextBox1_TextChanged"></asp:TextBox> <asp:Label ID="Label1" runat="server" Text="Hello World"></asp:Label> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="TextBox1" EventName="TextChanged" /> </Triggers> </asp:UpdatePanel> <script type="text/javascript"> function pageLoad() { // 在页面加载时注册文本框的失去焦点事件 var textBox = document.getElementById('<%= TextBox1.ClientID %>'); textBox.onblur = function() { __doPostBack('<%= TextBox1.ClientID %>', ''); } } </script> ``` 在上面的示例中,使用了 ASP.NET UpdatePanel 控件来实现异步更新 Label 的内容。当文本框失去焦点时,会触发 TextChanged 事件,在事件处理函数中更新 Label 的 Text 属性,然后将 UpdatePanel 的 UpdateMode 属性设置为 Conditional,以便在需要更新时才更新 UpdatePanel 中的内容。 需要注意的是,在 UpdatePanel 中需要设置 Triggers 属性来指定触发异步请求的控件和事件。在本例中,使用了 AsyncPostBackTrigger 来指定 TextBox1 的 TextChanged 事件作为异步请求的触发器。同时需要将 TextBox1 的 AutoPostBack 属性设置为 true,以便在文本框失去焦点时自动提交表单。 为了让文本框失去焦点时触发异步请求,需要在页面加载时注册文本框的失去焦点事件,使用 __doPostBack 函数手动提交表单。在本例中,使用了 JavaScript 来注册文本框的失去焦点事件。注意要使用 <%= TextBox1.ClientID %> 来获取文本框的客户端 ID,因为 ASP.NET 会自动生成一个不同于服务器控件 ID 的客户端 ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值