All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
visual c++中的画笔类CPen使用实例
asp.net2.0验证控件之RequiredFieldValidator控件使用方法
GridView,的各种用法(4)_[Asp.Net教程]
去除正文中的html标记,但是又想保留其中的<br>_[Asp.Net教程]
使用Forms,Authentication实现用户注册、登录,(二)用户注册与登录_[Asp.Net教程]
asp.net实现站点RSS功能_[Asp.Net教程]
PHP截取UTF-8字符串,解决半字符问题_[PHP教程]
PHP中常见的session问题_[PHP教程]
asp.net2.0中关于ASP.NET,网站管理工具无法连接sql,server,数据库的处理_[Asp.Net教程]
Windows XP&2003 IIS安装PHP&MySQL环境完全教程_[PHP教程]
Reading number is top 10 pictures
全球清廉国家排行
男人帮杂志里的惹火性感美女1
粉红蕾丝的美女
2015中美最新武器装备巅峰对决!
西班牙山村小景2
超强高考作文
新版武松打虎
美洲杯宝贝的雨中风情1
More attractive than sora aoi1
ashlynn brooke
Download software ranking
Jinling thirteen stock
Adobe Flash Player(IE) 10.0.32.18 浏览器专用的FLASH插件
Boxer's Top ten classic battle2
linux高级编程
豪门浪荡史
Ashlynn Video4
Eclipse 4.2.1 For Win32
Tram sex maniac 2 (H) rar bag13
仙剑奇侠传98硬盘WINXP版
徐若瑄成名作“魔鬼天使”
归海一刀 published in(发表于) 2014/3/16 2:53:33 Edit(编辑)
不用组件实现Ajax效果_[AJAX教程]

不用组件实现Ajax效果_[AJAX教程]

不用组件实现Ajax效果_[AJAX教程]

现在.NET的Ajax组件确实不少了,微软的ajax extensions用起来很方便,一个UpdatePanel就可以搞定一切。不过,可能有些朋友更愿意自己来写。那么在.NET里,你是否知道ICallbackEventHandler呢?


大家应该都知道ASP.NET页面调用时的几种方式:Postback/Cross-page posting/Server transfer/Callback,如果你还不太了解,你可以看看MSDN:How t Determine How ASP.NET Web Pages Were Invoked


现在要说的,就是Callback这种调用方式。
简单的说,使用Callback可以得到你平常看到那么Ajax效果,即不刷新整个页面,只更新其中一个部分。


使用Callback,只需要做以下4步:


1、在你的页面中继承System.Web.UI.ICallbackEventHandler接口


public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
}
#region ICallbackEventHandler Members
public string GetCallbackResult()
{
}
public void RaiseCallbackEvent(string eventArgument)
{
}
#endregion
}


如果你没有使用code-behind,那你也可以在aspx页面顶部加入下面的代码:


<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>


2、在前台写一段自定义的javascript,更新页面


这一段javascript用来更新页面的某个局部,就像你平常操作的一样,写些document.getElementById("xxx").innerHTML="working on your request...."。




你可能有些迷糊,就得到了吗?连个什么XMLHttpRequest都没有哩……


3、在Page_Load中再注册一段javascript


string script = Page.ClientScript.GetCallbackEventReference(this, "arg", "GetFlag", "");
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), .......//省略了一大串


上面的GetCallbackEventReference是用来得到客户端函数的引用,发起一个callback到服务器端的,你不必知道详细内容。


你只需要了解:



  • 第一个参数填this,用来handle客户端的callback的,它必须继承ICallbackEventHandler接口并提供RaiseCallbackEvent方法,我们已经在继承了这个接口,上面第一点中的代码也有RaiseCallbackEvent方法,只是还没有具体写内容呢。
  • 第二个参数就是那个 从客户端传到服务器端的参数。如果你想要注册的检查用户是否可用,那么这里的值就是用户输的那个值。
  • 第三个参数是前台的javascript函数名,在第二步中我们写的名字是:GetFlag。当数据好了,这个javascript函数就会用到。
  • 第四个参数一般用不上。

返回值:一个函数的名字,是客户端调用的函数名。这个函数会调用到服务器端了。


4、调用你的函数。


onclick="callServer()" />


上面一定是 onclick="callServer()"吗?呵呵,这要看你了,你在Page.ClientScript.RegisterClientScriptBlock注册的什么javascript函数名字,就是什么名字了。(在第3步的第二行code中)


已经完了。如果你还是一头雾水,没关系,下面看一个实例


我们写一个检测用户是否已经注册的小程序,这在每个用户注册页面上都可以用到。


前台Default.aspx:


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableViewState="false" %>



ICallbackEventHandler Demo










onclick="callServer()" />
查询用户是否被使用。






上面有一个onclick="callServer()" />,这是我说的第5步的内容,这个函数名字callServer应该和Lage_Load中注册的相对应的。


后台Default.aspx.cs:


using System;
using System.Data;
using System.Configuration;
using System.Collections;
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
{
private string _arg = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
string script = Page.ClientScript.GetCallbackEventReference(this, "arg", "GetFlag", "");//上面的第3步,取得这个客户端函数名,script的值可能是这样的:WebForm_DoCallback('__Page',arg,GetFlag,\"\",null,false)
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callServer", "\nfunction callServer(){\ndocument.getElementById(\"result\").innerHTML=\"正在检查 \"+document.getElementById(\"userid\").value+\" 的可用性,请稍候...\";\nvar arg=document.getElementById(\"userid\").value;\n" + script + ";\n}", true);
//上面这一行有点长了,第二个参数最长,看到function callServer()了吗,这就是和前台对应的那个函数名onclick=XXX,请记得,一定要在callServer函数中加入script的值,也就是上一行的上一行(17行)那个值。注意后面的var arg=...,这个arg和17行的arg是对应的。
}
#region ICallbackEventHandler Members
public string GetCallbackResult()
{
System.Threading.Thread.Sleep(1000);//让线程睡一会,我们好看效果。这是用来模拟不良网络状况的。
return _arg;//返回一个string型,这个string在RaiseCallbackEvent函数中是赋过值的,看下面哦。
}
public void RaiseCallbackEvent(string eventArgument)
{
if (eventArgument.Equals("99love") || eventArgument.Equals("blueidea"))//假设这两个名字不能注册,实际操作中,你要是比对数据库记录的,我们现在简化处理了。
_arg = string.Format("很遗憾,{0} 已被使用。", eventArgument);//要么已经注册了
else
_arg = string.Format("恭喜您,{0} 可以注册。", eventArgument);//要么就可以注册
}
#endregion
}


运行截图:






源码下载


希望这篇文章能在某些时候对您有所帮助。


来源:蓝色理想







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.