客户端回调控件- -(纯属乱想出来的[不过可以用阿哈哈])
- -怎么说呢利用net的机制实现客户端回调
原理:
--利用CallBackManager-首先客户端必须支持XmlHttp
1.客户端代码调用服务器端方法-->请求aspx页面-〉实例化页面,调用所用到的事件,直到Pre_Render事件为止
2执行服务器代码->解析服务器响应->客户端回调方法,接收服务器方法结果
-------------------服务器端处理
1==CallBackManager--必须知道客户端回调方法的名称,才能在调用服务器端方法,由CallBackManager解析响应时,确定在客户端调用
那个方法
2==为了在处理服务器端方法后指定调用那个客户端方法,可以使用
Page.ClientSideScriptManger.GetCallBackEventReference()方法,
--上面的方法还可以指定服务器异常的时候调用那个客户端方法
----------------------限制
不能指定调用服务器端的那个方法,客户端回调统统调用RaiseCallbackEvent方法--该方法属于IcallbackEventHandler
-----ICallbackEventHandler接口带有2个方法必须重写
//入口-----------eventargs客户端发入的函数
public void RaiseCallbackEvent(string eventargs)
{
}
//调用这个方法返回结果
public string GetCallbackResult()
{
return DateTime.Now.ToString(); ;
}
//--照规矩先看代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="testAjaxCall.aspx.cs" Inherits="test_testAjaxCall" %>
<!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>Untitled Page</title>
<script>
//--正常回 调用
function ClientCallback(result,context)
{
// alert(result);
// document.getElementById("ccc").innerHTML=result
////window.alert(context)--会产生 ddd
document.getElementById("ccc").value=result
}
//--错误
function ClientErrorCallback(error,context)
{
alert("ddd"+error);
}
//--调用服务器端函数
function cctv()
{
ValidateNumber("123","ddd")
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="ccc" />
<button onclick="cctv()" />
</div>
</form>
</body>
</html>
<!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>Untitled Page</title>
<script>
//--正常回 调用
function ClientCallback(result,context)
{
// alert(result);
// document.getElementById("ccc").innerHTML=result
////window.alert(context)--会产生 ddd
document.getElementById("ccc").value=result
}
//--错误
function ClientErrorCallback(error,context)
{
alert("ddd"+error);
}
//--调用服务器端函数
function cctv()
{
ValidateNumber("123","ddd")
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="ccc" />
<button onclick="cctv()" />
</div>
</form>
</body>
</html>
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 test_testAjaxCall : System.Web.UI.Page, ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
//检查客户端的浏览器是否支持客户端回调
if (!Request.Browser.SupportsCallback)
{
throw new ApplicationException("您的机器不支持客户端回调");
}
//获得回调事件引用,其实就是把客户端调用服务器的方法在这获得它的脚本形式
//--调用下面代码的到的字符串 WebForm_DoCallback('__Page',arg,ClientCallback,ctx,ClientErrorCallback,false)
string src=Page.ClientScript.GetCallbackEventReference(
this,//执行IcallbackEventHandler的控件
"arg",//要发送给RaiseCallbackEvent的值--传递的参数,也就是调用这个函数的函数给当前函数传递的参数
"ClientCallback",//客户端回调方法的名称
"ctx",//有客户端事件传送回客户端回调方法的数值--cotext的数据
"ClientErrorCallback",//客户端错误回调方法的名称。这个方法在服务器抛出异常时执行
false);//--参数不明(大概是同步或异步请求)
//下面的这个客户端方法就是调用上面src里面的脚本--注意这个arg就是传送给上面的arg的参数~~
//ctx--是传送给上面函数的ctx~~明白了~~
string mainSrc=@"function ValidateNumber(arg,ctx)
{"+src+";}";
//--注册上面生成的脚本
Page.ClientScript.RegisterClientScriptBlock(
this.GetType(),//一-种类型,使同一个键可以使用两次
"ValidateNumber",//--标识脚本块的唯一键,就是mainSrc个代码块是-- ValidateNumber的名称
mainSrc,//--要添加到客户机中的脚本块
true);//--允许方法插入<script>标记
}
//客户端回调限制必须调用这个方法
public void RaiseCallbackEvent(string eventargs)
{
}
//调用这个方法返回结果
public string GetCallbackResult()
{
return DateTime.Now.ToString(); ;
}
}
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 test_testAjaxCall : System.Web.UI.Page, ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
//检查客户端的浏览器是否支持客户端回调
if (!Request.Browser.SupportsCallback)
{
throw new ApplicationException("您的机器不支持客户端回调");
}
//获得回调事件引用,其实就是把客户端调用服务器的方法在这获得它的脚本形式
//--调用下面代码的到的字符串 WebForm_DoCallback('__Page',arg,ClientCallback,ctx,ClientErrorCallback,false)
string src=Page.ClientScript.GetCallbackEventReference(
this,//执行IcallbackEventHandler的控件
"arg",//要发送给RaiseCallbackEvent的值--传递的参数,也就是调用这个函数的函数给当前函数传递的参数
"ClientCallback",//客户端回调方法的名称
"ctx",//有客户端事件传送回客户端回调方法的数值--cotext的数据
"ClientErrorCallback",//客户端错误回调方法的名称。这个方法在服务器抛出异常时执行
false);//--参数不明(大概是同步或异步请求)
//下面的这个客户端方法就是调用上面src里面的脚本--注意这个arg就是传送给上面的arg的参数~~
//ctx--是传送给上面函数的ctx~~明白了~~
string mainSrc=@"function ValidateNumber(arg,ctx)
{"+src+";}";
//--注册上面生成的脚本
Page.ClientScript.RegisterClientScriptBlock(
this.GetType(),//一-种类型,使同一个键可以使用两次
"ValidateNumber",//--标识脚本块的唯一键,就是mainSrc个代码块是-- ValidateNumber的名称
mainSrc,//--要添加到客户机中的脚本块
true);//--允许方法插入<script>标记
}
//客户端回调限制必须调用这个方法
public void RaiseCallbackEvent(string eventargs)
{
}
//调用这个方法返回结果
public string GetCallbackResult()
{
return DateTime.Now.ToString(); ;
}
}
Ok上面就是原理了+代码的简单应用咯
,简单说就是把上面的回调封装到了控件的单击事件中了,不过这个做的不够好有待改进~~不过我困了
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;
/// <summary>
/// Summary description for Class1
/// </summary>
namespace CallbackTest
{
public class CallbackButton : HtmlButton, ICallbackEventHandler
{
public string CallBackArgument
{
get
{
string s = (string)ViewState["CallbackButton"];
if (s == null)
{
return string.Empty;
}
return s;
}
set
{
ViewState["CallbackButton"] = value;
}
}
protected override void RenderAttributes(HtmlTextWriter writer)
{
base.RenderAttributes(writer);
writer.WriteAttribute("onClick", Page.ClientScript.GetCallbackEventReference(
this,//执行IcallbackEventHandler的控件
this.CallBackArgument,//要发送给RaiseCallbackEvent的值--传递的参数,也就是调用这个函数的函数给当前函数传递的参数
"ButtonCallback",//客户端回调方法的名称
base.UniqueID,//有客户端事件传送回客户端回调方法的数值--cotext的数据
"ButtonErrorCallback",//客户端错误回调方法的名称。这个方法在服务器抛出异常时执行
false) + ";return false;");//--参数不明(大概是同步或,false异步调用)
}
public void RaiseCallbackEvent(string eventargs)
{
}
//调用这个方法返回结果
public string GetCallbackResult()
{
return DateTime.Now.ToString(); ;
}
}
}
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;
/// <summary>
/// Summary description for Class1
/// </summary>
namespace CallbackTest
{
public class CallbackButton : HtmlButton, ICallbackEventHandler
{
public string CallBackArgument
{
get
{
string s = (string)ViewState["CallbackButton"];
if (s == null)
{
return string.Empty;
}
return s;
}
set
{
ViewState["CallbackButton"] = value;
}
}
protected override void RenderAttributes(HtmlTextWriter writer)
{
base.RenderAttributes(writer);
writer.WriteAttribute("onClick", Page.ClientScript.GetCallbackEventReference(
this,//执行IcallbackEventHandler的控件
this.CallBackArgument,//要发送给RaiseCallbackEvent的值--传递的参数,也就是调用这个函数的函数给当前函数传递的参数
"ButtonCallback",//客户端回调方法的名称
base.UniqueID,//有客户端事件传送回客户端回调方法的数值--cotext的数据
"ButtonErrorCallback",//客户端错误回调方法的名称。这个方法在服务器抛出异常时执行
false) + ";return false;");//--参数不明(大概是同步或,false异步调用)
}
public void RaiseCallbackEvent(string eventargs)
{
}
//调用这个方法返回结果
public string GetCallbackResult()
{
return DateTime.Now.ToString(); ;
}
}
}