• ASP.NET回调使用初探


    页面的回发是在服务端中重新创建页面以及相应的控件,并且在服务器上运行相应的页面代码,最后将完整的新版本的页面发送回浏览器重新呈现。该方法会导致页面的刷新(重新加载)。整个页面将在服务端和浏览器客户端中往返一次,并且使用ViewState保存数据,网络消耗流量加大。

    页面的回调则是使用浏览器脚本函数(JS等)向服务端的当前页面类发送相应请求,当前的页面类初始化页面并创建控件和其他相关成员,然后调用特殊方法,执行代码中自定义的操作过程,最后通过另一个方法返回结果给客户端浏览器,浏览器则使用另一个浏览器端的脚本函数读取结果值。此过程中页面保持在浏览器,没有任何刷新过程。实现了AJAX的无刷新效果。

    前台代码*.aspx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <html xmlns="http://www.w3.org/1999/xhtml"
    <head runat="server"
        <title></title
        <script type="text/javascript"
            //该方法接收回调服务器端返回的结果数据 
            //这边相当于服务器端的returnValue值,函数名为Page.ClientScript.GetCallbackEventReference()方法的第3个参数 
            //这个函数声明及函数体位于服务器端的Page_Load方法中,通过页面加载时动态添加到客户端脚本 
            function callback(returnValue) { 
            //操作返回结果值 
                alert(returnValue); 
            
            //客户端按钮调用事件 
            function ClientCallBack() { 
                //获取客户端数据, 
                var d = document.getElementById("txtName").value; 
                //调用函数传递一个字符串变量, 
                //该变量最终传递到后台的RaiseCallbackEvent()方法参数中 
                CallServer(d); 
            
        </script
    </head
    <body
        <form id="form1" runat="server"
        <div
     <%-- 该处全部使用HTML客户端控件,不能是服务端控件,如果是服务端控件,则将引发页面的回发 --%> 
     <input type="text" id="txtName" /> 
        <input type="button" id="btnCallBack"  value="callback" onclick="ClientCallBack()" /> 
        </div
        </form
    </body
    </html>

    后台代码:*.aspx.cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
        
    namespace RepateruSE 
    {         
        /* HtmlCallBack页面类必须实现ICallbackEventHandler接口,该接口包含以下2个方法:RaiseCallbackEvent()和GetCallbackResult() 
        * RaiseCallbackEvent()参数是从浏览器端传来的,最后将结果用GetCallbackResult()返回浏览器 
        */
        public partial class HtmlCallBack : System.Web.UI.Page, ICallbackEventHandler 
        
        
        
            public string returnValue = null;//存储回调的返回值 
            protected void Page_Load(object sender, EventArgs e) 
            {   /* 使用Page.ClientScript.GetCallbackEventReference()可获取浏览器端的脚本函数的引用 
                   以下4个参数分别为指定控件(页面对象this)、浏览器端发送的参数(arg) 、 
                 * 浏览器端接收结果的函数名称(callback)以及上下文(context) 
                 * 最后reference变量保存该引用。 
                 */
                string reference = Page.ClientScript.GetCallbackEventReference(this"arg""callback""context"); 
        
                //CallServer函数是浏览器端函数,接收1个参数 
                //调用Page.ClientScript.RegisterClientScriptBlock方法将CallServer函数注册到页面对象客户端脚本中 
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer"
                    "function CallServer(arg,context){ " + reference + "};"true); 
            
        
            //该方法返回回调的结果到客户端上 
            public string GetCallbackResult() 
            
                if (writeAll()) 
                
        
                    returnValue += "true"
                
                else
                    returnValue += "false"
        
                //返回结果 
                return returnValue; 
            
            //该方法是回调的执行方法,可以根据参数处理不同的回调内容 
            public void RaiseCallbackEvent(string eventArgument) 
            
                returnValue = eventArgument; 
            
        
            //测试服务端执行事件 
            private bool writeAll() 
            
                string str = "text"
                for (int i = 0; i < 10; i++) 
                    str += i; 
        
                System.IO.File.WriteAllText(@"c:\test.txt", str); 
                return true
            
        
    }

    要完成客户端回调,页面类定义时必须实现ICallbackEventHandler接口,也就是必须实现该接口的两个方法( RaiseCallbackEvent()和GetCallbackResult() )。RaiseCallbackEvent方法用于接收浏览器端脚本函数传递的变量和GetCallbackResult方法返回结果值到另一个浏览器端脚本函数。

    该方法实现无刷新改变数据和AJAX的不同就是,该方法由ASP.NET提供,不需要用到AJAX框架,也无需手动编写XMLHTTP对象。

    本文从百度空间搬家到博客园。

  • 相关阅读:
    java四种线程池的使用
    @Autowired@Resource@Qualifier的区别
    Unsupported major.minor version 52.0解决办法
    CentOS7配置防火墙
    redis 集群搭建
    excludepathpatterns 无效
    解决 SpringBoot 没有主清单属性
    Java Web应用中调优线程池的重要性
    spring boot application properties配置详解
    Class path contains multiple SLF4J bindings.
  • 原文地址:https://www.cnblogs.com/yunanwu/p/4168595.html
Copyright © 2020-2023  润新知