“无刷新页面”,只是一种不确切的效果描述(其实还有其他各种方法来实现这个效果),更确切的说法是:在页面上用JavaScript调用服务器端的一个方法,然后处理返回的数据。实现它最标准的方法当然是XMLHTTP。但是,程序员都是懒惰的家伙,每个人都希望能有更方便的方法,或者,更佳的包装。比如,Lostinet的Rane就是对XMLHTTP的一个很好的包装。
终于,在ASP.NET 2.0里面,我们可以轻松的来做到这点了。服务器端任何实现了System.Web.UI.ICallbackEventHandler接口的控件,都可以通过RaiseCallbackEvent()方法来处理从页面上的JS脚本传递过来的请求和数据,处理后,再将结果传回给页面。这项能力的底层仍然是XMLHTTP。
下面是一个简单的演示:
在页面上,我们放上两个文本框和一个按钮:
<INPUT id="txtMessage">
<INPUT onclick="callToServer();" type="button" value="Call to Server">
Result : <INPUT id="txtResult" >
当点击按钮的时候,将调用JS脚本方法callToServer(),JS脚本如下:
function callToServer()
{
var param = document.getElementById("txtUsername").value;
var context = "";
<% = ClientScript %> <% = ClientScript %>
}
function handleResultFromServer(result, context)
{
document.getElementById("txtResult").value = result;
}
handleResultFromServer()方法则负责将从服务器传回的数据写到txtResult这个文本框里面。
再看看服务器端的代码:
public partial class Default_aspx : System.Web.UI.ICallbackEventHandler
{
private String ClientScript
{
get
{
return this.GetCallbackEventReference(this, "param", "handleResultFromServer", "context");
}
}
public string RaiseCallbackEvent(string eventArgument)
{
return "客户端在[" + DateTime.Now.ToString() + "]传送来 [" + eventArgument + "].";
}
}
我们让页面直接实现ICallbackEventHandler接口,然后接口定义的RaiseCallbackEvent()方法中将服务器的时间和传来的数据一起返回回去。
ClientScript属性的作用是,它调用了页面的GetCallbackEventReference()方法,获得了让客户端有能力调用服务器端方法的JS脚本,并输出到页面的callToServer()方法中,这样,点击页面按钮时,就开始执行页面上包含了调用服务器方法的的callToServer()方法。
注意GetCallbackEventReference()方法的参数,在参数中,我们定义了客户端的哪个变量包含了要传递给服务器,服务器方法执行后,调用客户端的哪个方法等信息。GetCallbackEventReference()的详细参看请看这里。
最后,我们这个页面的执行效果就是:
打印 | 张贴于 2004-07-07 23:42:00 | Tag:ASP.NET



留言反馈
踏着我的肩膀让我助你摆脱菜鸟的称谓,不要给我面子
别乱发东西!
1.比较意外的是,我的MSDN上的例子似乎是错的,如MSDN上的
public String RaiseCallbackEvent(String eventArgument As String)
{
return eventArgument + " new value";
}
返回值和参数的语法都无法通过编译.返回应为void,参数的语法更是奇特,看不明白.
另外,根据编译器的提示,ICallbackEventHandler需要实现的方法还有另一个:GetCallbackResult(),用于向客户端返回结果.这些用法和MSDN上的完全不符合.
2.贴子里面定义的ClientScript属性本身就是Page的属性,楼主的程序是怎么通过的,我实在想不通,请高手解释一下吧.
我对程序做了一些修改,最后成功了,现在贴出完整的代码,请指正:
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 callToServer()
{
var param = document.getElementById("txtMessage").value;
var context = "Client Context";
<% = CallbackScript %>
alert(this.callToServer);
}
function handleResultFromServer(result, context)
{
document.getElementById("txtResult").value = result;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<input id="txtMessage" value="Client:" />
<input onclick="callToServer();" type="button" value="Call to Server" />
Result : <input id="txtResult" />
</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 sResult="";
protected void Page_Load(object sender, EventArgs e)
{
}
public String CallbackScript
{
get
{
return this.ClientScript.GetCallbackEventReference(this, "param", "handleResultFromServer", "context");
}
}
public void RaiseCallbackEvent(String eventArgument )
{
this.sResult="客户端在[" + DateTime.Now.ToString() + "]传送来 [" + eventArgument + "].";
}
public string GetCallbackResult()
{
return this.sResult;
}
}
不知道是什么原因呢。
不知道是什么原因呢。
可怜啊会的不多还要继续学习了
可怜啊会的不多还要继续学习了
,看来似乎只有页面文件才可以!
比如我有三个DIV1 DIV2 DIV3 三个DIV
当鼠标放在DIV1 上是,为Girdview提供数据的控件的值变为 1
当鼠标放在DIV2 上是,为Girdview提供数据的控件的值变为 2
应该怎样做呢,请高手们提示一下.
“ajax_callback”不会实现接口成员“System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(string)”。“ajax_callback.RaiseCallbackEvent(string)”或者是静态、非公共的,或者有错误的返回类型。 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\nettest\6cf35618\ca62edba\App_Web_26uqex3g.0.cs
错误 2 “ajax_callback”不会实现接口成员“System.Web.UI.ICallbackEventHandler.GetCallbackResult()” c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\nettest\6cf35618\ca62edba\App_Web_26uqex3g.0.cs
好象把一个数据库查询结果返回到前端由JS处理,这本来的出发点就有问题,JS只应处理界面展示,你可以在后台处理数据,只将展现的结果传回前台显示即可, ICALLBACKEVENTHANDER的关键是无刷新的后台访问,关心的是界面用户体验.具体实现你可以来看我的blog(nzai.cnblogs.com)
接口中并没有 GetCallbackEventReference()方法,此方法的具体实现可以通过“this.ClientScript.GetCallbackEventReference(this, "param", "handleResultFromServer", "context");”来实现,另外后台中的ClientScript属性也应更换名称,还有的就是在ICallbackEventHandler接口中并没有返回string的RaiseCallbackEvent方法,你还需要实现这一方法。
换了也不行啊
public partial class _Default : System.Web.UI.Page
{
private String ClientScript
{
get
{//GetCallbackEventReference
return this.RaiseCallbackEvent(this, "param", "handleResultFromServer", "context") ;
}
}
public string RaiseCallbackEvent(string eventArgument)
{
return "客户端在[" + DateTime.Now.ToString() + "]传送来 [" + eventArgument + "].";
}
Error 2 'ASP.Default2_aspx.GetTypeHashCode()': no suitable method found to override c:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\Temporary ASP.NET Files\website2.0\39729a71\dfea2c6d\kqbk44nf.0.cs
为什么我的回报错,根本没有this.GetCallbackEventReference()方法
public partial class Default2 : System.Web.UI.ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
}
private String ClientScript
{
get
{
return this.GetCallbackEventReference(this, "param", "handleResultFromServer", "context");
}
}
public string RaiseCallbackEvent(string eventArgument)
{
return "客户端在[" + DateTime.Now.ToString() + "]传送来 [" + eventArgument + "].";
}
}
是不是与楼下Deneb的例子类似?
只写核心的吧,相信有不少这样的例子了,这个,班门弄斧吧
<!--
Copy CDURL.COM
Old Star Work room.
***********************
tel: +086-3147163861
Email:cdurl@hotmail.com
WelCome to Cdurl.com!
***********************
-->
function XMLClass(){
var R4 = true;
var RF = new Object;
var DID = "";
var Other = "";
this.Other = ""
this.PostClass ="post";
this.Cstr = "";
this.DID = ""
this.URLObjStr = ""
this.ReturnFuction = new Object;
this.XMLHTTPC = XMLHTTPC
var XMLHTTPcopy = new ActiveXObject("Microsoft.XMLHTTP");
function XMLHTTPC(){
DID=this.DID;
RF = this.ReturnFuction
Other=this.Other
XMLHTTPcopy.open(this.PostClass,this.URLObjStr,true);
XMLHTTPcopy.onreadystatechange = XMLDOMC;
XMLHTTPcopy.setRequestHeader("Content-Length",(this.Cstr).length);
XMLHTTPcopy.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
XMLHTTPcopy.send(this.Cstr);
}
function XMLDOMC(){
switch (XMLHTTPcopy.readyState){
case 0:
RePostViewButtonU()
RePostViewText("red","white","正在创建身份验证信息 ……");
return(false);
break;
case 1:
RePostViewButtonU()
RePostViewText("red","white","身份数据创建完毕,正在发送身份数据 ……");
return(false);
break;
case 2:
RePostViewButtonU()
RePostViewText("red","white","身份数据发送完毕,等待服务器回应 ……");
return(false);
break;
case 3:
RePostViewButtonU()
RePostViewText("red","white","服务器正在返回数据 ……");
return(false);
break;
case 4:
if (R4){
R4 = false;
var XMLDOMcopy=new ActiveXObject("Microsoft.XMLDOM");
XMLDOMcopy.loadXML(XMLHTTPcopy.responseXML.xml)
RF(XMLDOMcopy,DID,Other)
}
// XMLHTTPcopy = null;
// XMLDOMcopy = null;
break;
default:
RePostViewButtonU()
RePostViewText("red","white","网络出现严重错误!请检查您的连接状态 ……");
RePostViewButton("../../imge/bg/bbs/rebutton.gif","sandglass","UserLogin()")
RePostViewButton("../../imge/bg/bbs/cancelbutton.gif","hand","ReLoginFormvalue();")
RePostViewFlashStop();
return(false);
break;
}
}
}
基本构思就是这种 Ctrl 是假定在任意的容器中的,它的ViewState也是分开存放的。
用这个原理对这个Ctrl单独回发,然后起一个局部刷新而编程又简单的模型。
现在看来要先研究一下ASP。NET2的这个了。以免有冲突。
在ASP.NET 2.0中,已经抛弃了现在采用的页面类继承code-behind类的方法,而是采用了C# 2.0最新的语言特性,Partial Class来实现的。
不知道asp.net 2.0的适配器,如何处理只在PC运行的自定义的Js脚本 。