ASP.NET 2.0 正式版中callback的一些变化+使用示例 (转载)
2006-10-10 13:14
696 查看
本文来自 出走的影子 http://jackielin.cnblogs.com/archive/2005/11/27/callback.html
可能你觉得callback很弱,AJAX才够强。其实网上大多数callback的示例代码都是不太正确的(包括MSDN)。这里提供了一种不同的使用callback的方法。只用很少的javascript就实现了一个联级下拉框。你会发现:轻量级的callback其实也很好用。
在这里我有两个DropDownList,ddlCategory和ddlProduct。要求ddlCategory变化后ddlProduct无刷新的填充新的项目。
要使用Callback首先要继承ICallbackEventHandler接口:
public partial class Callback : Page, ICallbackEventHandler
或:
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
正式版的ICallbackEventHandler要实现以下两个方法:
string GetCallbackResult ()
void RaiseCallbackEvent (string eventArgument)
eventArgument现在改为由RaiseCallbackEvent接收,而不是由GetCallbackResult直接接受了。目的是为了让你可以在RaiseCallbackEvent中做一些初始化操作,这点在编写支持callback的控件时特别有用,有兴趣的话你可以参考GridView和DetailView中RaiseCallbackEvent的代码。在这里我只使用最简单的方式,把eventArgument存到一个私有成员中:
private string _callbackEventArgument;
protected virtual void RaiseCallbackEvent(string eventArgument)
{
this._callbackEventArgument = eventArgument;
}
在客户端触发callback需要使用到GetCallbackEventReference,正式版中的GetCallbackEventReference位于Page.ClientScript下。ClientScript是2.0中Page的一个新增成员,专门用于处理客户端教本(javascript),它是一个实例化的ClientScriptManager。
<script type="text/javascript">
function CallServer(arg, context)
{
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
}
function ReceiveServerData(result, context)
{
...
}
</script>
protected void Page_Load(object sender, EventArgs e)
{
ddlCategory.Attributes.Add("onchange", "CallServer(....)");
}
在这里我使用了一个javascript函数CallServer来包装callback的触发,当然你也可把它直接挂到onchange或其他客户端事件上。不过用一个函数来包装的话,可以很方便的在callback前后做一些其他操作,下面我就会用到。
不知道你有没有发觉,我们传给callback两个参数:arg和context,但是RaiseCallbackEvent只得到一个(arg),另一个参数context会给原封不动的传给ReceiveServerDate。这个context到底有什么用呢?甚至连MSDN里的代码也没有很正确的使用这个参数。可能你觉得callback很弱,只传入一个string(arg)传出一个string(result),还要编写大量的javascript代码才能实现想要的功能。其实,只要正确使用上面那个context参数就可以用很少的javascript实现很理想的功能。
首先,我们拆分一下arg,把我们要调用的服务端方法放进去:
ddlCategory.Attributes.Add("onchange", "CallServer('FillProduct|'+this.value, ...)");
然后用反射在服务器端调用这个方法(FillProduct):
public string GetCallbackResult()
{
string[] parts = _callbackEventArgument.Split('|');
return this.GetType().GetMethod(parts[0]).Invoke(this, new objcet[]{parts[1]}) ;
}
我们来看看FillProduct会返回些什么:
public string FillProduct(string categoryID)
{
ddlCategory.SelectedValue = categoryID;
ddlProduct.DataBind();
StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
HtmlTextWriter writer2 = new HtmlTextWriter(writer1);
ddlProduct.RenderControl(writer2);
writer2.Flush();
writer2.Close();
return writer1.ToString();
}
你可以看到,我把需要更新的ddlProduct整个重新Render后传回来了,也就是说要用新生成的ddlProduct的HTML替换原来的ddlProduct的HTML。怎么做到这一点呢?context参数要出马了:
<script type="text/javascript">
function CallServer(arg, context)
{
[b]context.innerHTML [/b][b]= "Loadingusing System;
using System.IO;
using System.Collections;
using System.Globalization;
using System.Reflection;
using System.Web;
using System.Web.UI;
public partial class Callback : Page, ICallbackEventHandler
可能你觉得callback很弱,AJAX才够强。其实网上大多数callback的示例代码都是不太正确的(包括MSDN)。这里提供了一种不同的使用callback的方法。只用很少的javascript就实现了一个联级下拉框。你会发现:轻量级的callback其实也很好用。
在这里我有两个DropDownList,ddlCategory和ddlProduct。要求ddlCategory变化后ddlProduct无刷新的填充新的项目。
要使用Callback首先要继承ICallbackEventHandler接口:
public partial class Callback : Page, ICallbackEventHandler
或:
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
正式版的ICallbackEventHandler要实现以下两个方法:
string GetCallbackResult ()
void RaiseCallbackEvent (string eventArgument)
eventArgument现在改为由RaiseCallbackEvent接收,而不是由GetCallbackResult直接接受了。目的是为了让你可以在RaiseCallbackEvent中做一些初始化操作,这点在编写支持callback的控件时特别有用,有兴趣的话你可以参考GridView和DetailView中RaiseCallbackEvent的代码。在这里我只使用最简单的方式,把eventArgument存到一个私有成员中:
private string _callbackEventArgument;
protected virtual void RaiseCallbackEvent(string eventArgument)
{
this._callbackEventArgument = eventArgument;
}
在客户端触发callback需要使用到GetCallbackEventReference,正式版中的GetCallbackEventReference位于Page.ClientScript下。ClientScript是2.0中Page的一个新增成员,专门用于处理客户端教本(javascript),它是一个实例化的ClientScriptManager。
<script type="text/javascript">
function CallServer(arg, context)
{
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
}
function ReceiveServerData(result, context)
{
...
}
</script>
protected void Page_Load(object sender, EventArgs e)
{
ddlCategory.Attributes.Add("onchange", "CallServer(....)");
}
在这里我使用了一个javascript函数CallServer来包装callback的触发,当然你也可把它直接挂到onchange或其他客户端事件上。不过用一个函数来包装的话,可以很方便的在callback前后做一些其他操作,下面我就会用到。
不知道你有没有发觉,我们传给callback两个参数:arg和context,但是RaiseCallbackEvent只得到一个(arg),另一个参数context会给原封不动的传给ReceiveServerDate。这个context到底有什么用呢?甚至连MSDN里的代码也没有很正确的使用这个参数。可能你觉得callback很弱,只传入一个string(arg)传出一个string(result),还要编写大量的javascript代码才能实现想要的功能。其实,只要正确使用上面那个context参数就可以用很少的javascript实现很理想的功能。
首先,我们拆分一下arg,把我们要调用的服务端方法放进去:
ddlCategory.Attributes.Add("onchange", "CallServer('FillProduct|'+this.value, ...)");
然后用反射在服务器端调用这个方法(FillProduct):
public string GetCallbackResult()
{
string[] parts = _callbackEventArgument.Split('|');
return this.GetType().GetMethod(parts[0]).Invoke(this, new objcet[]{parts[1]}) ;
}
我们来看看FillProduct会返回些什么:
public string FillProduct(string categoryID)
{
ddlCategory.SelectedValue = categoryID;
ddlProduct.DataBind();
StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
HtmlTextWriter writer2 = new HtmlTextWriter(writer1);
ddlProduct.RenderControl(writer2);
writer2.Flush();
writer2.Close();
return writer1.ToString();
}
你可以看到,我把需要更新的ddlProduct整个重新Render后传回来了,也就是说要用新生成的ddlProduct的HTML替换原来的ddlProduct的HTML。怎么做到这一点呢?context参数要出马了:
<script type="text/javascript">
function CallServer(arg, context)
{
[b]context.innerHTML [/b][b]= "Loadingusing System;
using System.IO;
using System.Collections;
using System.Globalization;
using System.Reflection;
using System.Web;
using System.Web.UI;
public partial class Callback : Page, ICallbackEventHandler
相关文章推荐
- ASP.NET 2.0 正式版中callback的一些变化+使用示例
- 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0)
- 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0)
- 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0)
- ASP.NET 2.0 正式版中callback的一些变化+使用示例
- 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0)
- 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0)
- ASP.NET2.0正式版中callback的一些变化+使用示例
- 【转载】使用Json比用string返回数据更友好,也更面向对象一些 |Asp.net MVC 2.0 + Unity 2.0(IoC) + EF4.0 实例:RoRoWoBlog 开源项目框架代码
- ASP.NET 2.0使用FileUpload控件上传文件示例
- ASP.NET 2.0 Client Callback 的一些问题
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- ASP.NET 2.0使用Web Part创建应用程序(转载--海东的技术资料)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- ASP.NET 2.0使用FileUpload控件上传文件示例
- Asp.net 2.0的一些小心得 (二) ObjectDataSource的使用
- Asp.net 2.0的一些小心得 (三) Master Page的使用
- AjaxPro.NET实现TextBox智能获取服务端数据功能(Asp.net 2.0)(示例代码下载) 转载
- 怎么在ASP.NET 2.0中使用Membership (转载)
- 使用ASP.net 2.0 的一些新特性