ClientScript的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要获取服务器端的返回结果.须调用方法GetCallbackEventReference.

Default.aspx :


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_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 FillData()
        {
           
var city=document.getElementById("TextBox1").value;
      
            
<% =this.ClientScript.GetCallbackEventReference(this,"city","FillDll",null)  %>;
        }
        
function FillDll(strcity)
        {
           document.getElementById(
"DropDownList1").options.length=0;
           
var indexofcity;
           
var city;
           
//切割传递来的字符串
           while(strcity.length>0)
           {
           
//判断是否是最后一个字符串
            indexofcity=strcity.indexOf(",");
            
if(indexofcity >0)
            {
            city
=strcity.substring(0,indexofcity);
            strcity
=strcity.substring(indexofcity+1);
            
//填充下拉框
            document.getElementById("DropDownList1").add(new Option(city,city));
            }
            
else
            {
            
// 如果是最后一个字符串
               document.getElementById("DropDownList1").add(new Option(strcity,strcity));
               
break;
            }
           };
        }
    
</script>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
<table style="width: 504px; height: 151px">
            
<tr>
                
<td colspan="2" style="font-weight: bold; color: #3300ff;">
                    使用回调技术实现局部刷新
</td>
            
</tr>
            
<tr>
                
<td style="width: 135px">
                    输入城市名称
</td>
                
<td style="width: 3px">
                    
<asp:TextBox ID="TextBox1" runat="server" Width="233px"></asp:TextBox></td>
            
</tr>
            
<tr>
                
<td style="width: 135px">
                
</td>
                
<td style="width: 3px">
                    
<input id="Button1" style="width: 131px" type="button" value="查询"  onclick="FillData()"/></td>
            
</tr>
            
<tr>
                
<td style="width: 135px">
                    选择区域列表
</td>
                
<td style="width: 3px">
                    
<asp:DropDownList ID="DropDownList1" runat="server" Width="237px">
                    
</asp:DropDownList></td>
            
</tr>
        
</table>
    
    
</div>
    
</form>
</body>
</html>

 

default.aspx.cs :


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;

public partial class
 _Default : System.Web.UI.Page,ICallbackEventHandler 
{
    
private string
 _data;
    
protected void Page_Load(object
 sender, EventArgs e)
    {
    }

    
#region ICallbackEventHandler 成员


    
public string GetCallbackResult()
    {
        
//返回处理后的数据

        return _data;
    }

    
public void RaiseCallbackEvent(string
 eventArgument)
    {
        
//判断传递过来的参数

        switch (eventArgument)
        {
            
case "北京"
:
                _data 
= "朝阳,海淀,东城,西城"
;
                
break
;
            
case "上海"
:
                _data 
= "浦东,静安,徐汇,虹口"
;
                
break
;
            
case "济南"
:
                _data 
= "历城,历下,市中,天桥"
;
                
break
;
        }
    }

    
#endregion

}
posted @ 2009-03-27 16:44  瑞君  Views(318)  Comments(0)    收藏  举报