• 客户端回调服务端无刷新事件


    首先,建立页面基类,服务端必须继承自ICallbackEventHandler接口,代码如下:

    public class PageBase : System.Web.UI.Page, ICallbackEventHandler     {     

        protected event PageCallBackEventHandler Page_CallBackEvent;

            protected override void OnLoad(EventArgs e)         {    

             base.OnLoad(e);      

       }

            protected override void CreateChildControls()         {

                base.CreateChildControls();         

    //注册客户端调用的js

        System.Text.StringBuilder sb = new System.Text.StringBuilder();  

               sb.Append("<script type='text/javascript'>");        

         sb.Append("function CallBack_Event(Key, context) {");  

    //定义回调的js方法名CallBackResult

               string strCallBack = ClientScript.GetCallbackEventReference(this, "Key", "CallBackResult", "context");    

             sb.Append(strCallBack);           

      sb.Append("");        

         sb.Append("");    

             sb.Append("");         

        sb.Append("}");        

         sb.Append("</script>");      

           RegisterScript(base.GetType(), "InitCallBack" + this.ClientID, sb.ToString());

            }       

    //注册脚本方法

      public static void RegisterScript(Type type, string key, string script)         {      

           if ((!string.IsNullOrEmpty(script) && !string.IsNullOrEmpty(key)) && (type != null))             {      

               string str = type.ToString();                 Page currentHandler = HttpContext.Current.CurrentHandler as Page;                 if (currentHandler != null)                 {

                        for (int i = 0; i < currentHandler.Header.Controls.Count; i++)                     {                         Control control = currentHandler.Header.Controls[i];                         if (control.GetType() == typeof(System.Web.UI.WebControls.ContentPlaceHolder))                         {                             System.Web.UI.WebControls.ContentPlaceHolder cph = control as System.Web.UI.WebControls.ContentPlaceHolder;                             if (cph != null)                             {                                 HtmlGenericControl autoCompleteScript = new HtmlGenericControl();                                 autoCompleteScript.InnerHtml = script;                                 cph.Controls.AddAt(0, autoCompleteScript);                                 break;                             }

                            }                     }                 }             }         }

     //定义事件委托

            protected delegate void PageCallBackEventHandler(object sender, PageCallBackEventArgs e);

    //返回值变量

            public string ResultData { get; set; }

    //定义事件参数

            protected class PageCallBackEventArgs : EventArgs         {             public PageCallBackEventArgs(string str)             {                 this.ClientParameter = str;             }             public readonly string ClientParameter;

            }

    //事件处理

            protected void OnPageCallBack(PageCallBackEventArgs e)        

    {           

      if (Page_CallBackEvent != null)    

             {              

       Page_CallBackEvent(this, e);     

            }    

         }

    //返回值到客户端

            public string GetCallbackResult()         {             return ResultData;         }

    //接收参数并触发事件

            public void RaiseCallbackEvent(string eventArgument)         {      

           PageCallBackEventArgs pcbe = new PageCallBackEventArgs(eventArgument);      

           OnPageCallBack(pcbe);        

    }    

    }

    下面是子页面,继承自刚定义的PageBase类,绑定自定义的事件

    public partial class _Default : PageBase     {         protected void Page_Load(object sender, EventArgs e)         {

                this.Page_CallBackEvent += _Default_Page_CallBackEvent;         }

            void _Default_Page_CallBackEvent(object sender, PageBase.PageCallBackEventArgs e)         {             if (e.ClientParameter == "aaa")             {                 this.ResultData = "ccc";             }         }

        }

    接下来是子页面前台

    <script type="text/javascript">

            function TestClick() {

          //触发后台回调

                  CallBack_Event("aaa", "bbb");

            }         function CallBackResult(context, result) {  

    //后台事件返回时会调用此方法

               alert(context + "," + result);

            }     </script>

    然后触发TestClick事件,异步回调就出来了。

  • 相关阅读:
    《Android源码设计模式》--装饰模式
    弹出对话框输入框
    顶部搜索框背景色渐变
    《Android源码设计模式》--模板方法模式
    《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
    《Android源码设计模式》--策略模式
    《Android源码设计模式》--抽象工厂模式
    《Android源码设计模式》--工厂方法模式
    《Android源码设计模式》--原型模式
    《Android源码设计模式》--Builder模式
  • 原文地址:https://www.cnblogs.com/zhouyu/p/zhouyu_callbackevent.html
Copyright © 2020-2023  润新知