首页 技术 正文
技术 2022年11月15日
0 收藏 363 点赞 4,870 浏览 2919 个字

在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致回发的一些其他操作。此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器。但是,在有些情况下,需要从客户端运行服务器代码,而不执行回发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外,页回发会导致处理开销,这会降低性能,且会让用户不得不等待处理并重新创建页。

若要避免丢失客户端状态并且不导致服务器往返的处理开销,可以对 ASP.NET 网页编码,使其能执行客户端回调。在客户端回调中,客户端脚本函数会向 ASP.NET 网页发送一个请求。该网页将以正常生命周期的修改版本运行。这会启动该页并创建其控件和其他成员,然后调用一个特别标记的方法。该方法执行代码中编写的处理过程,然后向浏览器返回可由另一客户端脚本函数读取的值。在此过程中,该页一直驻留在浏览器中。

有几个 Web 服务器控件可以使用客户端回调。例如,TreeView 控件使用客户端回调实现其即需填充功能。有关更多信息,请参见 TreeView Web 服务器控件概述

在 ASP.NET 网页中,有一些选项可用于自动处理客户端回调。ASP.NET 中的 AJAX 功能(例如 UpdatePanel 服务器控件)可自动完成异步部分页更新,其 Web 服务通信功能可自动完成异步 Web 服务调用。

有关 ASP.NET 中可自动处理客户端回调的 AJAX 功能的概述,请参见以下主题:

您也可以编写自己的客户端脚本来直接实现客户端回调。本主题讨论如何实现自己的客户端回调,以便在客户端与服务器之间进行异步通信。

ICallbackEventHandler 接口。可以向任何 ASP.NET 网页添加此接口声明。

  • 提供 RaiseCallbackEvent 方法的实现。此方法将被调用以对服务器执行回调。

  • 提供 GetCallbackResult 方法的实现。此方法会将回调结果返回给客户端。

  • 此外,该页还必须包含执行以下操作的三个客户端脚本函数:

    • 一个函数调用帮助器方法,该方法执行对服务器的实际请求。在此函数中,可以执行自定义逻辑,以最先准备事件实参。您可以将字符串作为形参发送给服务器端的回调事件处理程序。

    • 另一个函数由处理回调事件的服务器代码的结果调用并接收该结果,同时接受表示该结果的字符串。此函数称为客户端回调函数。

    • 第三个函数是执行实际服务器请求的 Helper 函数。当在服务器代码中使用 GetCallbackEventReference 方法生成对此函数的引用时,ASP.NET 将自动生成此函数。

    客户端回调和回发都是针对原始页面的请求。因此,它们在 Web 服务器日志中被记录为页面请求。

    ICallbackEventHandler 接口作为页的类声明的一部分进行声明。如果创建代码隐藏页,则可以通过使用如下语法声明该接口。

    VB 

    public partial class CallBack_DB_aspx :
    System.Web.UI.Page, System.Web.UI.ICallbackEventHandler

    如果正在处理单文件页或用户控件,则可以通过在页中使用 @ Implements 指令来添加声明,如下面的示例所示:

    VB 

    <%@ Page Language="C#" %>
    <%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
    在 ASP.NET 网页中不经过回发而以编程方式实现客户端回调说明:

    接口名区分大小写。

    创建服务器回调方法

    在服务器代码中,必须创建一个实现 RaiseCallbackEvent 方法的方法和一个实现 GetCallbackResult 方法的方法。RaiseCallbackEvent 方法接受单个字符串参数,而不是通常用于事件处理程序的常见的两个参数。该方法的部分内容可能与下面的示例类似:

    VB 

    public void RaiseCallbackEvent(String eventArgument)
    {}

    GetCallbackResult 不接受参数并返回一个字符串。该方法的部分内容可能与下面的示例类似:

    VB 

    public string GetCallbackResult()
    {
    return aStringValue;
    }

    ICallbackEventHandler 接口的库函数执行。通过调用页的 GetCallbackEventReference 方法可以获取对库函数的引用,该方法可通过页 ClientScript 属性进行访问。然后动态生成一个客户端函数,该函数包含对来自 GetCallbackEventReference 方法的返回值的调用。应向该方法传递以下内容:一个对页的引用(在 C# 中为 this,在 Visual Basic 中为 this)、传递数据时所使用的参数名称、将接收回调数据的客户端脚本函数的名称,以及传递所需的任何上下文的参数。

    生成函数之后,通过调用 RegisterClientScriptBlock 方法将其插入到页中。

    下面的示例演示如何以动态方式创建一个名为 CallServer 且调用回调的函数。

    VB 

    void Page_Load(object sender, EventArgs e)
    {
    ClientScriptManager cm = Page.ClientScript;
    String cbReference = cm.GetCallbackEventReference(this, "arg",
    "ReceiveServerData", "");
    String callbackScript = "function CallServer(arg, context) {" +
    cbReference + "; }";
    cm.RegisterClientScriptBlock(this.GetType(),
    "CallServer", callbackScript, true);
    }

    由正在生成的函数接受的参数名称应与传递给 GetCallbackEventReference 方法的值的名称相匹配。

    下面的示例演示一些可用于调用回调并处理其返回值的标记:

    VB 

    <input type="button" value="Callback"
    onclick="CallServer(1, alert('Callback'))"/>
    <br />
    <span id="Message"></span>

    接收回调

    可以编写在页中静态接收回调的客户端函数。该函数的名称必须与在 GetCallbackEventReference 方法调用中传递的名称相匹配。接收函数接受两个字符串值:一个用于返回值,另一个(可选)用于从服务器传回的上下文值。

    该函数可能与下面的示例类似:

      

    <script type="text/javascript">
    function ReceiveServerData(arg, context)
    {
    Message.innerText = 'Processed callback.';
    }
    </script>
    相关推荐
    python开发_常用的python模块及安装方法
    adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
    日期:2022-11-24 点赞:878 阅读:8,917
    Educational Codeforces Round 11 C. Hard Process 二分
    C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
    日期:2022-11-24 点赞:807 阅读:5,442
    下载Ubuntn 17.04 内核源代码
    zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
    日期:2022-11-24 点赞:569 阅读:6,255
    可用Active Desktop Calendar V7.86 注册码序列号
    可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
    日期:2022-11-24 点赞:733 阅读:6,068
    Android调用系统相机、自定义相机、处理大图片
    Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
    日期:2022-11-24 点赞:512 阅读:7,700
    Struts的使用
    一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
    日期:2022-11-24 点赞:671 阅读:4,741