程序之路还在摸索学习之中,如果我有什么错误的地方,请各位大家多多指正,谢谢。
在写程序的过程中,一些小的Ajax效果我不大喜欢去用Ajax框架来做,为了一点点效果就去动用Ajax框架这个相对庞大的家伙显然有点不明智。很多简单的Ajax效果,利用 ICallbackEventHandler接口 ,加点简单的代码就可以很轻松的完成。下面将演示怎样利用ICallbackEventHandler接口 实现客户端回调,实现 检查用户名是可用 的实例。
既然要实现回调功能,客户端当然也少不了要有一个向服务器端发送回调请求的函数。用ClientScriptManager类的GetCallbackEventReference方法可以在页面注册一个回调函数。下面来看看GetCallbackEventReference方法在MSDN中的解释:
语法:
public string GetCallbackEventReference(
Control control,
string argument
string clientCallback
string context
string clientErrorCallback
bool useAsync
)
参数
control
处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
argument 从客户端脚本传递给服务器端的一个参数
clientCallback
一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果
context
启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序
clientErrorCallback
客户端事件处理程序的名称,该处理程序在服务器端事件处理程序出现错误时接收结果
useAsync
true 表示同步执行回调 false 表示异步执行回调
返回值
调用客户端回调的客户端函数的名称。
public partial class _Default : System.Web.UI.Page ,ICallbackEventHandler
string[] UserNames = { "LixingTie", "生铁" };
string CallbackResult = null;
public void RaiseCallbackEvent(string eventArgument)
{
if(eventArgument == "生铁猪")
throw new Exception("请别进行人身攻击!");
CallbackResult = Array.IndexOf(UserNames, eventArgument) != -1 ? "该帐户已注册" : "未注册用户";
}
这里,在RaiseCallbackEvent方法中,对客户端提交过来的用户名参数eventArgument进行了判断,如果用户名是 "生铁猪" 的话,就抛出一个导常,这主要是用来测试客户端事件处理服务器端处理出错的情况,这里先不理。如果客户端提交上来的用户不是 "生铁猪" ,则判断用户名是否已存在(用户是否在 UserNames 中, 是否为 "LixingTie", "生铁" 之一),如果存在的话,处理结果为 "该帐户已注册" 否则为 "未注册用户"。
public string GetCallbackResult()
{
return CallbackResult;
}
这个方法的实现就比较简单,就单纯的返回RaiseCallbackEvent方法的处理结果CallbackResult;
protected void Page_Load(object sender, EventArgs e)
{
if (Page.Request.Browser.SupportsXmlHttp)
{
ClientScriptManager cs = Page.ClientScript;
string callbackScript = cs.GetCallbackEventReference(this, "GetClientUserName()", "OnCallbackCompleted", null, "OnServerError", true);
string callbackScriptMethod = "function CallbackScriptMethod() { " + callbackScript + " ;}";
cs.RegisterClientScriptBlock(this.GetType(), "CallbackScriptMethod", callbackScriptMethod, true);
}
}
先用ClientScriptManager cs = Page.ClientScript;来获得页页的ClientScriptManager引用。然后通过GetCallbackEventReference注册发送回调请求的函数,cs.GetCallbackEventReference(this, "GetClientUserName()", "OnCallbackCompleted", "", "OnServerError", true);
参数一 this 代表处理客户端回调的控件为当前页。
参数二 "GetClientUserName()" 是页面上的一个javascript函数,该函数返回的是用户在TextBox中输入的用户名,用户名将提交到服务器进行判断,GetClientUserName()函数的具体内容将在下面补上。
参数三 "OnCallbackCompleted" 表示接收服务器端事件处理结果的javascript函数为 OnCallbackCompleted 函数。
参数四 null,这个实例不需要用到这个参数,所以给它一个空值。这个参数的具体作用见上面MSDN的解释。
参数五 "OnServerError",这个参数指定了当服务器端处理出错时,由客户端的javascript函数OnServerError()来接收错误信息并处理。在这个实例中,当用户在TextBox里输入 "生铁猪" 的时候服务器端会抛出错误并调用客户端函数OnServerError()处理错误并显示。
参数六 true 表示同步执行这次回调。
GetCallbackEventReference函数将根据参数返回一个string类型的发送回调请求的脚本,我们把这个脚本保存在callbackScript变量中。
string callbackScriptMethod = "function CallbackScriptMethod() { " + callbackScript + " ;}"; 这条语句将拼接一个名为CallbackScriptMethod的javascript脚本,然后把回调请求脚本放在这个函数体内。这样做以后就可以在javascript里通过CallbackScriptMethod() 函数引发回调。
cs.RegisterClientScriptBlock(this.GetType(), "CallbackScriptMethod", callbackScriptMethod, true); 这条语句把引发回调的函数CallbackScriptMethod()发送到客户端。
至于if (Page.Request.Browser.SupportsXmlHttp)这句是用来检测客户端浏览器是否XmlHttp,因为回调功能使用了XmlHttp,所以,在不支持XmlHttp的浏览器中,这个功能是不能用的。
<body>
<form ></span>
</div>
</form>
</body>
<script language="javascript" type="text/javascript">
function GetClientUserName()
{
return document.getElementById("<%=ClientUserName.ClientID %>").value;
}
function CheckUserName()
{
CallbackScriptMethod();
}
function OnCallbackCompleted(CallbackResult,context)
{
document.getElementById("message").innerText = CallbackResult;
}
function OnServerError(error)
{
alert("错误信息 " + error);
}
</script>
GetClientUserName为刚刚服务器端代码需要用到的获取用户输入的用户名的函数。通过document.getElementById("<%=ClientUserName.ClientID %>").value;取得Textbox ClientUserName的值。注意这里用的ID是ClientUserName.ClientID而不是直接用ClientUserName,原因是服务器控件的ID和服务器发送到客户端的ID可能会不同。ClientID是获取发送到客户端的ID。
OnCallbackCompleted 是接收服务器端处理结果的函数。
OnServerError 是处理服务器出错的函数。
CheckUserName 是点击检查按钮时候调用的函数,这个函数将调用服务器端生成的引发回调的函数CallbackScriptMethod(),引发回调。
完整的页面代码如下:
<%@ 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>CallbackTest</title>
<script language="javascript" type="text/javascript">
function GetClientUserName()
{
return document.getElementById("<%=ClientUserName.ClientID %>").value;
}
function CheckUserName()
{
CallbackScriptMethod();
}
function OnCallbackCompleted(CallbackResult,context)
{
document.getElementById("message").innerText = CallbackResult;
}
function OnServerError(error)
{
alert("错误信息 " + error);
}
</script>
</head>
<body>
<form ></span>
</div>
</form>
</body>
</html>
可以看到,输入"生铁猪"的时候,除了我们原先定义的错误信息外,后面还符加有一段字符,这段字符具体代表的是什么我不大清楚,我想应该是错误的一些附加信息吧。不知道这样认为对不对,知道的朋友请告诉我一下,谢谢。
程序之路还在摸索学习之中,如果我有什么错误的地方,请各位大家多多指正,谢谢。