zoukankan      html  css  js  c++  java
  • GetCallbackEventReference(客户端调用服务器端)的用法

        GetCallbackEventReference函数在 .NET Framework 2.0 版中是新增的。
        MSDN解释:获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文。

    函数原型:
    public string GetCallbackEventReference (
     Control control,
     string argument,
     string clientCallback,
     string context
    )

        第一个参数指定了服务器端将要处理回调的目标对象,即处理客户端回调的服务器端控件。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
             如果传入的是this,则表示页面本身。也可以传入任何实现了ICallbackEventHandler的页面控件(page control)的引用。
             在任何情况下,客户端的提交动作(submit action)会提交至和标准回传(postback)机制相同的ASPX页面。
        第二个参数是一个JavaScript常量表达式,表示页面传给服务器的输入数据。如将一个下拉列表当前选中元素的值传入

              "document.getElementById['cboEmployees'].value"。
        第三个参数是一个用户定义在<script>块中的JavaScript回调(callback)函数名。回调(callback)执行后,此函数最终负责页面的更新。
        最后两个可选参数可用来指定错误处理函数(error handler)和上下文对象(context object)。

    GetCallbackEventReference函数将产生如下的脚本调用:

        WebForm_DoCallback(pageID, input, UpdateEmployeeViewHandler, nullnull);
        此函数的代码会自动下载到客户端并通过<script>标签添加到页面响应(page's response)中。WebForm_DoCallback 使用XmlHttpRequest DOM对象

        (XmlHttpRequest DOM object)回调(call back)当前页面的URL。
        与此同时,它会添加一些额外的隐藏域(hidden field)以便服务器区分更简单的轻量级回调(callback)请求和一般回传(postback)请求。处理请求时,ASP.NET运行时(runtime)标识出调用的目标对象(传给GetCallbackEventReference的第一个参数),确认它实现了ICallbackEventHandler接口后调用RaiseCallbackEvent方法:

    void RaiseCallbackEvent (
       string eventArgument
    )
        eventArgument一般即是通过GetCallbackEventReference指定的页面传递到服务器端的输入数据,即参数2。

        RaiseCallbackEvent处理完毕,即通过调用 public string GetCallbackResult() 将处理结果返回给调用控件,交由客户端执行GetCallbackEventReference指定的客户端脚本clientCallback,由其完成客户端刷新。

        上面说过,脚本回调(script callback)并不适用于所有浏览器,尽管最新的浏览器,包括Internet Explorer 5+, Netscape 6+, and Safari1.2+都能行。
        Microsoft在ASP.NET 2.0中加入了两个新的browser bapabilities:SupportsXmlHttp 与SupportsCallback以便开发人员检查方案的可行性。

    一条让页面刷新更快的告诫
        尽管脚本回调(script callback) 定义在ASP.NET 2.0中,要使其在ASP.NET 1.1里工作也并不很困难。在ASP.NET 2.0中,很多服务器控件(server control)借助脚本回调(script callback)提供了更迅速的页面刷新。
        最突出的例子也许是GridView控件(GridView control),作为DataGrid的接班人,选择性地运用脚本回调(script callback)实现分页显示记录。
        正如前面所说,脚本回调(script callback)依赖于文档对象模型(DOM)的XmlHttpRequest对象。在Internet Explorer中,此文档对象模型对象(DOM object)通过     ActiveX控件(ActiveX control)实现——Microsoft.XmlHttp。
       在IE中浏览这样的页面时,你必须适当降低安全设置以允许ActiveX控件(ActiveX control)能被脚本调用。在其他以同样方式实现XmlHttpRequest文档对象模型对象(DOM object)的浏览器中,这是不必要的。
        事实上,基于Mozilla的浏览内置支持了HTTP请求功能器,而没用使用ActiveX控件(ActiveX control)——这也是在Internet Explorer 7.0中被寄予厚望的功能。

    例,单击按钮得到服务器端处理后的结果:

     <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GetCallbackEventReferenceUse._Default" %> 
    <!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></title>
        <script type="text/javascript">
            //服务器端呼叫客户端方法
            function ClientReferenceServerData(returnValue) {
                alert(returnValue);
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            传给服务器参数:
            <input id="txbServerParameter" type="text" />
            <input id="btnCallServer" type="button" value="CallServer" onclick="ClientCallServer()" />
        </div>
        </form>
    </body>
    </html>
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text;

    namespace GetCallbackEventReferenceUse
    {
        public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
        {
            private string callBackResult = string.Empty;
            protected void Page_Load(object sender, EventArgs e)
            {
                //产生客户端调用服务器端的方法脚本
                string reference = Page.ClientScript.GetCallbackEventReference(this,
                    "document.getElementById('txbServerParameter').value",
                    "ClientReferenceServerData""");

                //客户端调用服务器端方法
                string callbackScript = "function ClientCallServer()" +
                  "{" +
                        reference
                  + ";}";
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ClientCallServer", callbackScript, true);
            }

            //返回结果
            public string GetCallbackResult()
            {
                return "Server result: " + callBackResult;
            }


            //回调时事件
            
    //eventArgument值与 Page.ClientScript.GetCallbackEventReference中的"document.getElementById('txbServerParameter').value"对应
            public void RaiseCallbackEvent(string eventArgument)
            {
                callBackResult = eventArgument;
            }

        }

    参考:http://www.cnblogs.com/mywebname/articles/1060383.html 
     

  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/scottckt/p/2514920.html
Copyright © 2011-2022 走看看