• net的机制实现客户端回调


    原理:
    --利用CallBackManager-首先客户端必须支持XmlHttp
    1.客户端代码调用服务器端方法-->请求aspx页面-〉实例化页面,调用所用到的事件,直到Pre_Render事件为止
    2执行服务器代码->解析服务器响应->客户端回调方法,接收服务器方法结果
    -------------------服务器端处理
    1==CallBackManager--必须知道客户端回调方法的名称,才能在调用服务器端方法,由CallBackManager解析响应时,确定在客户端调用
    那个方法
    2==为了在处理服务器端方法后指定调用那个客户端方法,可以使用
    Page.ClientSideScriptManger.GetCallBackEventReference()方法,
    --上面的方法还可以指定服务器异常的时候调用那个客户端方法
    ----------------------限制

    不能指定调用服务器端的那个方法,客户端回调统统调用RaiseCallbackEvent方法--该方法属于IcallbackEventHandler

    -----ICallbackEventHandler接口带有2个方法必须重写
    //入口-----------eventargs客户端发入的函数
     public void RaiseCallbackEvent(string eventargs)
     {
      
     }
    //调用这个方法返回结果
    public string GetCallbackResult()
    {
            return DateTime.Now.ToString(); ;
    }

    //--照规矩先看代码

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="testAjaxCall.aspx.cs" Inherits="test_testAjaxCall" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        
    <title>Untitled Page</title>
        
    <script>
        
    //--正常回 调用
        function ClientCallback(result,context)
        
    {
    //        alert(result);
    //
            document.getElementById("ccc").innerHTML=result
    //
    //window.alert(context)--会产生 ddd
    document.getElementById("ccc").value=result
        }

        
    //--错误
        function ClientErrorCallback(error,context)
        
    {
            alert(
    "ddd"+error);
        }

        
    //--调用服务器端函数
        function cctv()
        
    {
          ValidateNumber(
    "123","ddd")
        }

        
    </script>
    </head>
    <body>
        
    <form id="form1" runat="server">
        
    <div>
        
    <input id="ccc" />
        
    <button onclick="cctv()" />
        
        
    </div>
        
    </form>
    </body>
    </html>
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    public partial class test_testAjaxCall : System.Web.UI.Page, ICallbackEventHandler
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {
            
    //检查客户端的浏览器是否支持客户端回调

            
    if (!Request.Browser.SupportsCallback)
            
    {
                
    throw new ApplicationException("您的机器不支持客户端回调");
            }

            
    //获得回调事件引用,其实就是把客户端调用服务器的方法在这获得它的脚本形式
            
    //--调用下面代码的到的字符串  WebForm_DoCallback('__Page',arg,ClientCallback,ctx,ClientErrorCallback,false)
            string src=Page.ClientScript.GetCallbackEventReference(
                                                                   
    this,//执行IcallbackEventHandler的控件
                                                                   "arg",//要发送给RaiseCallbackEvent的值--传递的参数,也就是调用这个函数的函数给当前函数传递的参数
                                                                   "ClientCallback",//客户端回调方法的名称
                                                                   "ctx",//有客户端事件传送回客户端回调方法的数值--cotext的数据
                                                                   "ClientErrorCallback",//客户端错误回调方法的名称。这个方法在服务器抛出异常时执行
                                                                   false);//--参数不明(大概是同步或异步请求)
           
    //下面的这个客户端方法就是调用上面src里面的脚本--注意这个arg就是传送给上面的arg的参数~~
            
    //ctx--是传送给上面函数的ctx~~明白了~~
            string mainSrc=@"function ValidateNumber(arg,ctx)
                         {
    "+src+";}";
            
    //--注册上面生成的脚本
            Page.ClientScript.RegisterClientScriptBlock(
                
    this.GetType(),//一-种类型,使同一个键可以使用两次
                "ValidateNumber",//--标识脚本块的唯一键,就是mainSrc个代码块是-- ValidateNumber的名称
                mainSrc,//--要添加到客户机中的脚本块
                true);//--允许方法插入<script>标记

               

        }

        
    //客户端回调限制必须调用这个方法
        public void RaiseCallbackEvent(string eventargs)
        
    {

        }

        
    //调用这个方法返回结果
        public string GetCallbackResult()
        
    {
            
    return DateTime.Now.ToString(); ;
        }

    }



    Ok上面就是原理了+代码的简单应用咯
    ,简单说就是把上面的回调封装到了控件的单击事件中了,不过这个做的不够好有待改进~~不过我困了

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    /// <summary>
    /// Summary description for Class1
    /// </summary>

    namespace CallbackTest
    {
        
    public class CallbackButton : HtmlButton, ICallbackEventHandler
        
    {
            
    public string CallBackArgument
            
    {
                
    get
                
    {
                    
    string s = (string)ViewState["CallbackButton"];
                    
    if (s == null)
                    
    {
                        
    return string.Empty;
                    }

                    
    return s;
                }

                
    set
                
    {
                    ViewState[
    "CallbackButton"= value;
                }


            }

            
    protected override void RenderAttributes(HtmlTextWriter writer)
            
    {
                
    base.RenderAttributes(writer);
                writer.WriteAttribute(
    "onClick", Page.ClientScript.GetCallbackEventReference(
                                                                   
    this,//执行IcallbackEventHandler的控件
                                                                   this.CallBackArgument,//要发送给RaiseCallbackEvent的值--传递的参数,也就是调用这个函数的函数给当前函数传递的参数
                                                                   "ButtonCallback",//客户端回调方法的名称
                                                                   base.UniqueID,//有客户端事件传送回客户端回调方法的数值--cotext的数据
                                                                   "ButtonErrorCallback",//客户端错误回调方法的名称。这个方法在服务器抛出异常时执行
                                                                   false+ ";return false;");//--参数不明(大概是同步或,false异步调用)

            }

            
    public void RaiseCallbackEvent(string eventargs)
            
    {

            }

            
    //调用这个方法返回结果
            public string GetCallbackResult()
            
    {
                
    return DateTime.Now.ToString(); ;
            }

        }

    }

    转载地址:http://www.cnblogs.com/ajaxren/archive/2007/05/06/736745.aspx
  • 相关阅读:
    JS中字符串的true转化为boolean类型的true
    jquery select change下拉框选项变化判断选中值
    C# 使用 NPOI 库读写 Excel 文件
    通过微信分享链接,后面被加上from=singlemessage&isappinstalled=1导致网页打不开
    C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
    SQL查询语句如何能够让指定的记录排在最后
    搞懂 JavaScript 继承原理
    基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
    SqlServer 使用sys.dm_tran_locks处理死锁问题
  • 原文地址:https://www.cnblogs.com/chorrysky/p/1238389.html
Copyright © 2020-2023  润新知