首先感谢sp1234大哥,请见:
http://topic.csdn.net/u/20080522/18/687e18b3-54aa-4909-b068-03aa84dc583b.html
虽然知道了,ICallbackEventHandler 接口 用的并不多,而且有更好的 Ajax 技术可以使用, 但自己想弄请这个问题。 毕竟有时候项目要求是不能用 Ajax 的。(客户有时也很怪!) 从 msdn 上 得到 : 需要以下几步 详见 :
http://msdn.microsoft.com/zh-cn/library/ms178208(VS.80).aspx#
声明 ICallbackEventHandler 接口 可以将 ICallbackEventHandler 接口作为页的类声明的一部分进行声明。如果创建代码隐藏页,则可以通过使用如下语法声明该接口。
创建服务器回调方法 在服务器代码中,必须创建一个实现 RaiseCallbackEvent 方法的方法和一个实现 GetCallbackResult 方法的方法。RaiseCallbackEvent 方法接受单个字符串参数,而不是通常用于事件处理程序的常见的两个参数。该方法的部分内容可能与下面的代码示例类似。 C# public void RaiseCallbackEvent(String eventArgument) { } GetCallbackResult 不接受参数并返回一个字符串。该方法的部分内容可能与下面的代码示例类似: C# public string GetCallbackResult() { return aStringValue; }
创建客户端脚本函数必须向页中添加客户端脚本函数以执行两个功能:向服务器页发送回调和接收结果。这两个客户端脚本函数都是用 ECMAScript (JavaScript) 编写。 发送回调 发送回调的函数在服务器代码中生成。实际回调由任何页都可使用的、实现 ICallbackEventHandler 接口的库函数执行。通过调用页的 GetCallbackEventReference 方法可以获取对库函数的引用,该方法可通过页 ClientScript 属性进行访问。然后动态生成一个客户端函数,该函数包含对来自 GetCallbackEventReference 方法的返回值的调用。向该方法传递以下内容:对页的一个引用(在 C# 中为 this,在 Visual Basic 中为 Me)、传递数据时所依据的参数名称、将接收回调数据的客户端脚本函数的名称,以及传递所需的任何上下文的参数。 生成函数之后,通过调用 RegisterClientScriptBlock 方法将其插入到页中。
接收回调 可以编写在页中静态接收回调的客户端函数。该函数的名称必须与在 GetCallbackEventReference 方法调用中传递的名称相匹配。接收函数接受两个字符串值:一个用于返回值,另一个(可选)用于从服务器传回的上下文值。 以下,我对应着做一下。并贴出我的代码,有思想不对的地方清指正。 我并不是动态生成的 CallServer 方法
---??这个方法就是 msdn 所说的 函数调用帮助器方法 么?? 不甚肯定!
声明 ICallbackEventHandler 接口
-
C# code
-
public partial class _Default : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
-
C# code
-
string ICallbackEventHandler.GetCallbackResult() { // System.Threading.Thread.Sleep(2000); return CallBackValue + " , C World! " ; } void ICallbackEventHandler.RaiseCallbackEvent( string eventArgument) { this .CallBackValue = eventArgument; }
-
C# code
-
< script type = " text/javascript " > function CallServer() // 发送回调 { var arg = " Cognizant " ; <%= ClientScript.GetCallbackEventReference( this , " arg " , " ReceiveServerData " , null ) %> ; } function ReceiveServerData(alertContent) // 接收回调 { alert(alertContent); } </ script >
-
C# code
-
<% @ 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 > Without Refresh Demo </ title > < script type = " text/javascript " > function CallServer() { var arg = " Cognizant " ; <%= ClientScript.GetCallbackEventReference( this , " arg " , " ReceiveServerData " , null ) %> ; } function ReceiveServerData(alertContent) { alert(alertContent); } </ script > </ head > < body > < form id = " form1 " runat = " server " > < div > < button onclick = " CallServer() " > HTML Button CallServer </ button > </ div > < div > < asp:Button ID = " btn1 " runat = " server " Text = " ASP:Button " /> </ div > </ form > </ body > </ html >
-
C# code
-
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, System.Web.UI.ICallbackEventHandler { protected void Page_Load( object sender, EventArgs e) { btn1.Attributes.Add( " onclick " , " CallServer();return false; " ); } private string CallBackValue = string .Empty; #region ICallbackEventHandler Members string ICallbackEventHandler.GetCallbackResult() { // System.Threading.Thread.Sleep(2000); return CallBackValue + " , C World! " ; } void ICallbackEventHandler.RaiseCallbackEvent( string eventArgument) { this .CallBackValue = eventArgument; } #endregion }
-
C# code
-
ClientScript.GetCallbackEventReference( this , " arg " , " ReceiveServerData " , null )
-
C# code
-
function CallServer() { var arg = " Cognizant " ; // 呵呵 违反了保密原则?? 开玩笑, 一个 单词而已嘛! <%= ClientScript.GetCallbackEventReference( this , " arg " , " ReceiveServerData " , null ) %> ; }
-
C# code
-
void ICallbackEventHandler.RaiseCallbackEvent( string eventArgument) { this .CallBackValue = eventArgument; }
-
C# code
-
string ICallbackEventHandler.GetCallbackResult() { // System.Threading.Thread.Sleep(2000); return CallBackValue + " , C World! " ; }
-
C# code
-
< script type = " text/javascript " > // ... function ReceiveServerData(alertContent) { alert(alertContent); } </ script >
执行过程大概就是这样, 不对的地方, 还请各位朋友 指出, 欢迎大家讨论下!
http://topic.csdn.net/u/20080605/15/d9b78af9-8a12-4e92-b889-8262d8860eeb.html