这段时间写asp.net代码遇到一个问题,如下代码,当用户点击确认后,js弹框给用户再次确认,再次点击确认后执行后台linkbutton代码,当用户点击取消时,执行另外的代码函数。

<asp:LinkButton ID="lbtnConfirmDeliverOffice" runat="server" OnClick="lbtnConfirmDeliverOffice_Click"
               OnClientClick="return confirm('是否确定转送到承办部门?')"  Width="35px" CssClass="btn btn-save">确认</asp:LinkButton>

在这个需求下,考虑使用__dopostback函数。函数的前面是两个下划线. __doPostBack=  "_" + "_" + "doPostBack"。

 一、了解__dopostback函数。

          这个函数提供了在JavaScript脚本中执行服务器控件事件处理函数的能力ASP.NET编程提供了服务器端控件和客户端控件之说,其本质还是脱离不了HTML,我们知道有些控件响应用户后需要做出一个和服务器端交互(PostBack)的过程,为了实现这个功能,ASP.NET服务器控件架构上增加了一个PostBack属性 当这个属性设置为Ture以后,页面就会自动产生__doPostBack函数用于处理用户的请求,另外页面上只要有LinkButton按钮也会自动产生__doPostBack函数,调用该函数提交不会触发控件的任何js事件而直接进入服务器端。 __doPostBack函数是一个纯粹并且是非常简单的javascript函数,大部分的页面PostBack都是由它触发的。注意,这里是“大部分”,因为只有两个(Button、ImageButton)会自己触发页面的PostBack,其它的所有控件都是通过__doPostBack函数触发页面的PostBack的,doPostBack通常都是有系统调用的,有时候为了处理一些特殊的需要,我要需要手动的触发__doPostBack函数。

函数原型:
function __doPostBack(eventTarget, eventArgument)
{
   // 该函数用于执行服务器控件的事件处理函数
}
参数:
    eventTarget: 要调用的服务器控件生成的name属性,如果是子控件,用''$'或':'分割,如: 父控件:子控件.
    eventArgument: 调用事件时的参数

 下面这段是直接从含有自动回传功能控件的.net Web页面的HTML源代码里面粘帖过来的。大家对照一下函数原型。

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

二、 __dopostback的简单应用。

        前台代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>   
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    <input type="button" style="width: 55px" class="btn btn-cancel" οnclick="myFunction()"
                value="确认" />
    <asp:LinkButton ID="confirm" runat="server"  οnclick="LinkButton2_Click"></asp:LinkButton>
    <asp:LinkButton ID="cancel" runat="server"  οnclick="LinkButton1_Click"></asp:LinkButton>

     <script defer="defer" type="text/javascript">
       function myFunction() {
           var result = window.confirm("Yes or NO?");
           if (result) 
           {
             __doPostBack('confirm','');
           }
           else 
           { 
             __doPostBack('cancel','');
           }
       }
</script>
    </form> 
</body>
</html>

            后台代码   :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace PartyStudio.Studio
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            Library.WebPage.LayoutHelper.MessageBoxJS("yes is choose");
        }

        protected void LinkButton2_Click(object sender, EventArgs e)
        {
            Library.WebPage.LayoutHelper.MessageBoxJS("No is choose");
        }
    }
}

       

 在页面中拖入两个linkbutton控件,后台中分别写入确认事件和取消事件的代码。再在前台页面加入一个按钮,onclick事件绑定js方法,判断

window.confirm("Yes or NO?");

返回的值,true则调用ID为“confirm”的linkbutton的__dopostback事件,false则调用ID为“cancel”的linkbutton的__dopostback事件。

调用__dopostback事件时,两个参数分别为(“linkbutton的ID”,“”)。

注意,传入的参数为linkbutton的clientID,也就是你自己定义的ID加上asp.net自动在前面加上的字符串。当中的“_”下划线要用“$”代替。