下面的代码第一次点击按钮时,总是弹出undefined,第二次以上才会弹出0;
请问怎么才能让代码第一次就弹出0呢?
GetCallbackEventReference的最后一个参数无论是true,还是false,都不起作用,一个简单的ICallbackEventHandler实现示例:
<%@ Page language="c#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<html>
<head>
    <script language="C#" runat="server">
        // 接口实现
        public string GetCallbackResult() {
            return "0";
        }
        public void RaiseCallbackEvent(string eventArgument) { }
    </script>
    
    <script type="text/javascript">
        var flg;
        function CallServer(){
            var arg = "abc";
            <%=ClientScript.GetCallbackEventReference(this, "arg", "JsRecieve", null, null, true) %>;
        }
        function JsRecieve(ret){
            flg = ret; 
        }
        function SubmitCheck(){
            CallServer();
            alert(flg);// 第一次运行,这里总是弹出undefined
        }
    </script>
</head>
<body>
    <form runat="server">
        <input type="button" onclick="SubmitCheck();" value="test">
    </form>
</body>
</html>

解决方案 »

  1.   

        <script language="C#" runat="server">
            // 接口实现
            public string GetCallbackResult()
            {
                return "0";
            }
            public void RaiseCallbackEvent(string eventArgument) { }
        </script>    <script type="text/javascript">
            var flg;
            function CallServer(){
                var arg = "abc";
                <%=ClientScript.GetCallbackEventReference(this, "arg", "JsRecieve", null, null, true) %>;
            }
            function JsRecieve(ret){
                flg = ret; 
                alert(flg);//这句要放在这里
            }
            function SubmitCheck(){
                CallServer();
                //alert(flg);// 第一次运行,这里总是弹出undefined
            }
        </script>
      

  2.   

    首先谢谢楼上的兄弟,问题是不能放在JsRecieve接收函数里。
      

  3.   

    谢谢楼上的兄弟,问题是不能在JsRecieve里处理事件。
      

  4.   

    有没有人知道呢?还是根本就不能实现?那么GetCallbackEventReference方法的最后一个参数又有什么作用呢?
      

  5.   

    给楼主一个简单的例子:public partial class ClientCallbacks : System.Web.UI.Page,ICallbackEventHandler
    {
    protected string txtUserInfo; //用户基本信息 protected void Page_Load(object sender, EventArgs e)
    {
    //动态注册JavaScript
    String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
    String callbackScript;
    callbackScript = "function CallServer(arg, context)" + "{ " + cbReference + "} ;";
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
    } //引发Callback事件处理
    public void RaiseCallbackEvent(string txtFirstName)
    {
    if (txtFirstName != null)
    {
                SqlConnection conn = new SqlConnection("data source=.;initial catalog=Northwind;Integrated Security=True");
    conn.Open(); SqlCommand cmd = new SqlCommand("select EmployeeID,FirstName,City,Address from Employees where FirstName=@FirstName", conn);
    cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = txtFirstName;
    SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read())
    {
    txtUserInfo = "员工代号:" + dr["EmployeeID"] + "  ,";
    txtUserInfo += "姓名:" + dr["FirstName"] + "  ,";
    txtUserInfo += "居住城市:" + dr["City"] + "  ,";
    txtUserInfo += "地址:" + dr["Address"].ToString().Replace("\r\n","") + "  ,";
    txtUserInfo += "服务器查询时间:" + DateTime.Now.ToLongTimeString();
    }
    else
    {
    if (String.IsNullOrEmpty(txtFirstName))
    {
    txtUserInfo = "请输入姓名";
    }
    else
    {
    txtUserInfo = "查无此人!";
    }
    } cmd.Dispose();
    dr.Dispose();
    conn.Dispose();
    }
    } //返回Callback结果
    public string GetCallbackResult()
    {
    return txtUserInfo; //返回员工基本信息
    }
     <script type="text/JavaScript">
        function DoSearch()
        {
            var txtFirstName = document.getElementById("txtUserName");
            CallServer(txtFirstName.value, "");
        }
        
        function ReceiveServerData(txtUserInfo)
        {
            Results.innerText = txtUserInfo;
        }
        
        setInterval('DoSearch()',1000);
      </script></head>
    <body>
        <form id="form1" runat="server">
        <div>
            姓名:<input id="txtUserName" type="text" /><br />
                <span ID="Results" style="background-color: pink; width: 500px;"></span>
        </div>
        </form>
      

  6.   

    汗一个楼上的,答非所问!!!算了,自己单步调试了一下,发现微软封装的函数里对xmlhttp的open里固定写为true
    下面是微软封装的js函数的部分内容    if (setRequestHeaderMethodExists) {
            xmlRequest.onreadystatechange = WebForm_CallbackComplete;
            callback.xmlRequest = xmlRequest;
            xmlRequest.open("POST", theForm.action, true);// 最后一个参数为true,表示异步执行回调
            xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlRequest.send(postData);
            return;
        }
    正因如此,所以使用ICallbackEventHandler接口,不可能实现同步执行,只能是异步执行还是那个疑问:GetCallbackEventReference方法的最后一个参数又有什么作用呢?
      

  7.   

    自己再顶,GetCallbackEventReference方法的最后一个参数又有什么作用呢?再过2天,没人回答时,无答案结了。