GetCallbackEventReference方法实现局部刷新,回调非WebSerice实现

主要介绍ClientScriptManager.GetCallbackEventReference 方法
开发环境:asp.net2.0
范例中asp.net2.0的新特性来实现客户端回调服务器事件来异步无刷新变更DropdownList中的选择列表,相对ajax来说可以不用webservice也可实现局部更新的作用.

获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。

参数描述
control
处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。

target(用control.UniqueID获得)
处理客户端回调的服务器 Control 的名称。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。

argument(用来传递字符串对象给服务器端,RaiseCallbackEvent 方法中接收参数可获取此值)
从客户端脚本传递给服务器端的一个参数  

clientCallback(回调成功后触发该脚本函数,此处用于注册该名称)
一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果。 

context(可以传入一个脚本函数或一个客户端对象,下面将介绍两种不同的表现方式)
启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。

clientErrorCallback(回调失败后触发该脚本函数,此处用于注册该名称)
客户端事件处理程序的名称,该处理程序在服务器端事件处理程序出现错误时接收结果。 

useAsync
true 表示同步执行回调;false 表示异步执行回调。

重载列表 
名称  说明  
ClientScriptManager.GetCallbackEventReference (Control, String(argument), String(clientCallback), String(context))  获 取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下 文。  
ClientScriptManager.GetCallbackEventReference (Control, String(argument), String(clientCallback), String(context), Boolean)  获 取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本、上下文和布 尔值。  
ClientScriptManager.GetCallbackEventReference (Control, String(argument), String(clientCallback), String(context), String(clientErrorCallback), Boolean)  获 取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本、上下文、错 误处理程序和布尔值。  
ClientScriptManager.GetCallbackEventReference (String(target), String(argument), String(clientCallback), String(context), String(clientErrorCallback), Boolean)  

大体步聚如下:
1.处理客户端回调的服务器控件继承ICallbackEventHandler接口,实现以下两个方法

 //处理客户端发出的参数.
 public void RaiseCallbackEvent(String eventArgument) { str = eventArgument) ; }

 //处理回发到客户端的结果,客户端在clientCallback端接收
 public string GetCallbackResult()  { return str }

2.使用page类中的ClientScript成员来管理脚本
使用ClientScriptManager cs = Page.ClientScript类

关联服务器控件以及向客户端注册脚本
String cbReference = cs.GetCallbackEventReference("'" +  Page.UniqueID + "'", "arg", "ReceiveServerData", "", "ProcessCallBackError", false);
String callbackScript = "function CallTheServer(arg, context) {" + cbReference2 + "; }";
cs.RegisterClientScriptBlock(this.GetType(), "CallTheServer", callbackScript, true);

3.注册客户端脚本函数
function ReceiveServerData(arg, context){   .......}
function ProcessCallBackError(arg, context){..............}

4.客户端调用脚本
CallTheServer1(arg, context)

范例一
Callback.aspx.cs代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.IO;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Callback : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
    public string str = string.Empty;

    // 处理客户端发出的参数.
    public void RaiseCallbackEvent(String eventArgument)
    {
        str = eventArgument;
    }

    // 处理回发到客户端的结果,客户端在clientCallback端接收.
    public string GetCallbackResult()
    {
        string[] str = new string[] { "11", "22", "33", "44" };
        ListItem item = null;
        this.drpList1.Items.Clear();
        foreach (string tmp in str)
        {
            item = new ListItem(tmp, tmp);
            this.drpList1.Items.Add(item);
        }

        StringWriter writer1 = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
        HtmlTextWriter writer2 = new HtmlTextWriter(writer1);
        this.drpList1.RenderControl(writer2);

        writer2.Flush();
        writer2.Close();
        return writer1.ToString();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        ClientScriptManager cs = Page.ClientScript;

        // 定义客户端成功调用后的处理函数
        StringBuilder context1 = new StringBuilder();
        context1.Append("function ReceiveServerData1(arg, context)");
        context1.Append("{");
        context1.Append("king.innerHTML =  arg;");
        context1.Append("}");

        // 定义客户端错误处理函数
        StringBuilder context2 = new StringBuilder();
        context2.Append("function ProcessCallBackError(arg, context)");
        context2.Append("{");
        context2.Append("alert('An error has occurred.');");
        context2.Append("}");

        //向客户端注册脚本
        cs.RegisterClientScriptBlock(this.GetType(), "ProcessCallBackError",
            context2.ToString(), true);

        //返回客户调用服务事件的脚本代码,结果如 下:WebForm_DoCallback('__Page',arg,ReceiveServerData1,function ReceiveServerData1(arg, context){king.innerHTML =  arg;},ProcessCallBackError,false);
        //其中的content值为一段脚本函数
        String cbReference1 = cs.GetCallbackEventReference("'" +
            Page.UniqueID + "'", "arg", "ReceiveServerData1", context1.ToString(),
            "ProcessCallBackError", false);

        String callbackScript1 = "function CallTheServer1(arg, context) {" +
            cbReference1 + "; }";

        // 注册触发回调事件的脚本块
        cs.RegisterClientScriptBlock(this.GetType(), "CallTheServer1",
            callbackScript1, true);
    }
   
}

Callback.aspx代码如下:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Callback.aspx.cs" Inherits="Callback" %>
<!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>GetCallbackEventReference</title>
</head>
<body>
    <form id="form1" runat="server">
    <span id="king">
        <asp:DropDownList ID="drpList1" runat="server" Width="171px">
            <asp:ListItem>asa</asp:ListItem>
        </asp:DropDownList>
        </span>
        <a href="javascript:CallTheServer1('', '')">变更</a>
    </form>
</body>
</html>


范例二
Callback1.aspx.cs代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.IO;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Callback1 : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
    public string str = string.Empty;

    // Define method that processes the callbacks on server.
    public void RaiseCallbackEvent(String eventArgument)
    {
        str = eventArgument;
    }

    // Define method that returns callback result.
    public string GetCallbackResult()
    {
        string[] str = new string[] { "11", "22", "33", "44" };
        ListItem item = null;
        this.drpList1.Items.Clear();
        foreach (string tmp in str)
        {
            item = new ListItem(tmp, tmp);
            this.drpList1.Items.Add(item);
        }

        StringWriter writer1 = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
        HtmlTextWriter writer2 = new HtmlTextWriter(writer1);
        this.drpList1.RenderControl(writer2);

        writer2.Flush();
        writer2.Close();
        return writer1.ToString();
    }

    protected void Page1_Load(object sender, EventArgs e)
    {
        ClientScriptManager cs = Page.ClientScript;

        //定义客户端成功调用后的处理函数
        StringBuilder context1 = new StringBuilder();
        context1.Append("function ReceiveServerData1(arg, context)");
        context1.Append("{");
        context1.Append("context.innerHTML =  arg;");
        context1.Append("}");

        // 定义错误处理函数
        StringBuilder context2 = new StringBuilder();
        context2.Append("function ProcessCallBackError(arg, context)");
        context2.Append("{");
        context2.Append("alert('An error has occurred.');");
        context2.Append("}");

        //向客户端注册脚本
        cs.RegisterClientScriptBlock(this.GetType(), "ReceiveServerData1",
           context1.ToString(), true);
        cs.RegisterClientScriptBlock(this.GetType(), "ProcessCallBackError",
            context2.ToString(), true);

        //返回客户调用服务事件的脚本代码,结果如 下:WebForm_DoCallback('__Page',arg,ReceiveServerData1,function ReceiveServerData1(arg, context){king.innerHTML =  arg;},ProcessCallBackError,false);
        //其中的content为king客户端king对象
        String cbReference1 = cs.GetCallbackEventReference("'" +
            Page.UniqueID + "'", "arg", "ReceiveServerData1", "context",
            "ProcessCallBackError", false);

        String callbackScript1 = "function CallTheServer1(arg, context) {" +
            cbReference1 + "; }";

        // 注册触发回调事件的脚本块
        cs.RegisterClientScriptBlock(this.GetType(), "CallTheServer1",
            callbackScript1, true);
    }
   
}

Callback1.aspx代码如下:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Callback.aspx.cs" Inherits="Callback" %>
<!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>GetCallbackEventReference</title>
</head>
<body>
    <form id="form1" runat="server">
    <span id="king">
        <asp:DropDownList ID="drpList1" runat="server" Width="171px">
            <asp:ListItem>asa</asp:ListItem>
        </asp:DropDownList>
        </span>
        <a href="javascript:CallTheServer1('', king)">变更</a>
    </form>
</body>
</html>

我主要是用于选择相应对象,系统通过此方法返回一个对象列表供用户选择。其他应用暂时没用到,如你有不同有应用,不妨留言交个朋友.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值