zoukankan      html  css  js  c++  java
  • Asp.Net回调技术

    实现回调技术需要以下步骤:

    1.实现ICallbakEventHandler

    2.实现接口中的方法:RaiseCallbackEvent

    3.实现GetCallbackResult

    方法 解释 参数
    void RaiseCallbackEvent(string eventArgument) 处理以控件为目的的回调事件 表示要传递到事件处理程序的事件参数
    string GetCallbackResult() 返回以控件为目的的回调事件的结果  

    先看例子,再来解释:

    1.建立一个aspx页面,内容如下:

    页面代码:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <input type="text" id="txtname" name="txtname" onblur="CallServer(this.value,null)" />
            <span id="msg"></span>
            <input type="submit" value="Submit" />
            <script type="text/javascript">
                function Success(args,context){
                    document.getElementById("msg").innerText=args;
                }
                
                function Error(args,context){
                    document.getElementById("msg").innerText=args;
                }
            </script>
        </form>
    </body>
    </html>
    此处,并没有看到定义了CallServer函数,也没有看到有调用Success和Error的地方.且看后台.
    实现ICallbackEventHandler接口.
    后台代码:
        protected void Page_Load(object sender, EventArgs e)
        {
            string reference = Page.ClientScript.GetCallbackEventReference(this, "args", "Success", "", "Error", false);
            string callbackscript = "function CallServer(args,context){\n" +
                reference + ";\n}";
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callback", callbackscript, true);
        }
    
        public string GetCallbackResult()
        {
            return ViewState["result"].ToString();
        }
    
        public void RaiseCallbackEvent(string eventArgument)
        {
            if (eventArgument.Equals("admin"))
            {
                ViewState["result"] = "不可以被使用!";
            }
            else
            {
                ViewState["result"] = "可以使用";
            }
        }
    

    此时,看到了关于Page.ClientScript.GetCallbackEventReference的使用,同时也看到了CallServer方法的定义.且看GetCallbackEventReference方法的定义:

    GetCallbackEventReference:获取一个对客户端参数的引用;调用该函数时,将启动一个对服务器事件的回调.即:返回一个函数,该函数是可以将页面提交到服务器.

    其中,在例子中使用的函数参数的解释如下:

    GetCallbackEventReference(Control control,string argument,string clientcallback,string context,string clientErrorcallback,bool useAsync)

    control:处理客户端回调的服务器Control.

    argument:一个参数,该参数从客户端脚本传递给服务器的RaiseCallbackEvent事件.

    clientCallback:一个客户端函数,用于处理当事件成功运行时的函数

    context:启动回调之前,在客户端计算的客户端脚本,脚本的结果传递给事件处理程序.

    clientErrorcallback:一个客户端函数,用于处理当事件失败时运行的函数.(本例中虽然有该参数,但是实际上并未使用)

    useAsync:true表示异步执行回调,false表示同步执行回调

    运行页面,查看效果,是否发现,页面在进行用户判断时不再进行整页的刷新.

    页面执行流程如下:

    1.当textbox失去焦点时,调用CallServer方法

    2.CallServer方法将this.value值传入RaiseCallbackEvent方法的参数中,然后进行判断,随后调用GetCallbackResult()方法

    3.此时,再执行页面中定义的Success方法.

    查看运行页面的源代码,形成的客户端HTML代码如下:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head><title>
    	无标题页
    </title></head>
    <body>
        <form name="form1" method="post" action="Default2.aspx" id="form1">
    <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="/wEPDwUJNzgzNDMwNTMzZGS4em2NMZLtsU4YN7EFuXT4tLpJrA==" />
    </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>
    
    
    <script src="/kongjian/WebResource.axd?d=KYfh-S4VutWcM_01AnkeqQ2&amp;t=633934581566718750" type="text/javascript"></script>
    
    
    <script type="text/javascript">
    //<![CDATA[
    function CallServer(args,context){
    WebForm_DoCallback('__Page',args,Success,"",Error,false);
    }//]]>
    </script>
    
            <input type="text" id="txtname" name="txtname" onblur="CallServer(this.value,null)" />
            <span id="msg"></span>
            <input type="submit" value="Submit" />
            <script type="text/javascript">
                function Success(args,context){
                    document.getElementById("msg").innerText=args;
                }
                
                function Error(args,context){
                    document.getElementById("msg").innerText=args;
                }
            </script>
        
    
    <script type="text/javascript">
    //<![CDATA[
    
    WebForm_InitCallback();//]]>
    </script>
    </form>
    </body>
    </html>

    注意页面中这段代码:

    <script type="text/javascript">
    //<![CDATA[
    function CallServer(args,context){
    WebForm_DoCallback('__Page',args,Success,"",Error,false);
    }//]]>
    </script>
    此段代码正是在pageload事件中生成的
        protected void Page_Load(object sender, EventArgs e)
        {
            string reference = Page.ClientScript.GetCallbackEventReference(this, "args", "Success", "", "Error", false);
            string callbackscript = "function CallServer(args,context){\n" +
                reference + ";\n}";
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callback", callbackscript, true);
        }

    此时,再来看WebForm_DoCallback方法.

    将源代码中一段script代码下下来./kongjian/WebResource.axd?d=KYfh-S4VutWcM_01AnkeqQ2&amp;t=633934581566718750

    查找其中的WebForm_DoCallback方法代码,简单列出一部分:

        var xmlRequest,e;
        try {
            xmlRequest = new XMLHttpRequest();
        }
        catch(e) {
            try {
                xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e) {
            }
        }
        var setRequestHeaderMethodExists = true;
        try {
            setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);
        }
        catch(e) {}
        var callback = new Object();
        callback.eventCallback = eventCallback;
        callback.context = context;
        callback.errorCallback = errorCallback;
        callback.async = useAsync;
    

    看到这段代码,会发现,原来已经建立的xmlHttpRequest对象了.后面就不说了.

  • 相关阅读:
    uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 无效的列类型: 1111; nested exception is java.sql.SQLException: 无效的列类型: 1111
    Oracle批量更新数据,使用begin end
    oracle数字返回为字符串时小时点前面的0缺失的问题
    nginx集群配置
    nginx解决跨域(前后端分离)
    Spring ContextLoaderListener And DispatcherServlet Concepts
    Troubleshooting Upgrade and CU Batch jobs stuck in a waiting status in Dynamics AX 2012
    Dynamics AX 2012 – Batch Jobs Not Executing
    Query Table Element
    PeopleCode JobRunStatus
  • 原文地址:https://www.cnblogs.com/oneword/p/1608007.html
Copyright © 2011-2022 走看看