__doPostBack的总结

1.__doPostBack是什么,有什么用?

   __doPostBack前面是两个“_”,属于javascript的一个方法,是用于客户端向服务器提交信息,从而调用后台。asp.net的服务器控件都会自动调用__doPostBack脚本。

2.__doPostBack的两个参数怎么理解?

  该方法有两个参数:第一个参数为控件ID,第二个参数为事件参数。

3.客户端控件模拟服务器端控件postback

   前台代码:

    <form id="form1" runat="server">
    <div>

    </div>
    <input type="hidden" />

       // 服务器端控件有自己的__doPostBack事件
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"  />
        <asp:ImageButton ID="ImageButton1" runat="server" />

       //此处为客户端控件,在其点击事件里调用__doPostBack脚本
        <input id="buttonClient" type="button" οnclick="__doPostBack('form1',“test”);" />
       
        <img id="image" οnclick="__doPostBack('image','test');" />
       
    </form>

  后台代码:

        protected void Page_Load(object sender, EventArgs e)
        {
            string target = Request.Form["__EVENTTARGET"];
            string args = Request.Params["__EVENTARGUMENT"];
            foreach (string str in Request.Form)
            {
                Control c = Page.FindControl(str);
                if (c is Button)
                {
                    break;
                }
            }


        }

        public void Button1_Click(object sender, EventArgs e)
        {
            string target = Request.Form["__EVENTTARGET"];
            string args = Request.Form["__EVENTARGUMENT"];
        }
        public void test()
        {
       
        }
    }

   结果:

   发现问题1:当点击Button1即服务器端控件的时候会走到后台,而点击buttonClick按钮并不会,这是因为客户端控件即使有__doPostBack()方法也不会自动回发到服务器,

   页面 上需要有回发服务器的控件,于是在form里加上下面的代码

           <asp:LinkButton ID="linkBtn" runat="server" Visible="true">link</asp:LinkButton>
        <asp:TextBox ID="TextBox2" runat="server" AutoPostBack="true"></asp:TextBox>

   以上加的控件选择其一即可,这里要说明其中的一个问题:

  发现问题2:

   LinkButton不用设置AutoPostBack=“true”,而其它的控件需要设置该属性,才能成功。

  发现问题3:

  LinkButton的visible属性设置为false时又postback到后台,经调查结论是:因为当我们把visible属性设置为false的时候,浏览器在解析的时候,根本不会把这个控件放在页面上, 也就是说这个控件是不存在的,所以我们在调用__doPostBack函数的时候,便会找不到控件。

4.__doPostBack的原理

点击buttonClient按钮后右键页面查看源码会发现以下代码:

<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTMxOTYzNjgyMGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFDEltYWdlQnV0dG9uMRBnx90OJq2koEoz27efEVApisZJ" />
</div>

<script type="text/javascript">
//<![CDATA[
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>

以上的代码为之前页面所没有的,点击后才加上的,红色的代码正是原理所在。即postback的时候页面会新建两个隐藏的自定义控件来存储doPostBack的两个参数,点击按钮即完成提交(submit)的动作,从而提交到服务器。

5:补充

对于服务器的ImageButton和Button来说,在后台的代码中以Request.Params["__EVENTARGUMENT"]和Request.Params["__EVENTTARGET"];
的方式得到的是空,而对于这两个之外的服务器控件都可以用上述的两个表达式得到__doPostBack的两个参数值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值