asp.net2.0中的客户端回调的使用

原创 2006年05月23日 16:57:00

在实际应用中,经常需要在客户端输入时选择一下类别,这个类别经常会是大类和小类,以前在ASP中实现的时候是全部读取出来,再通过javascript来实现点击大类后小类列表更新,在.net2.0里,通过客户端回调就可以实现这种功能。

我的实际应用例子之一:页面名称是setType.aspx,以下是代码片段,这个是客户端显示的页面

<asp:Content ID="Content1" ContentPlaceHolderID="mainTable" Runat="Server">
<script language="javascript" type="text/javascript">
function CallServer(arg, context)
{
      context.innerHTML = "Loading";
      <%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context") %>;
}
function ReceiveServerData(result, context)
{
    context.innerHTML = result;
}
</script>
                            设置类别:<asp:DropDownList ID="ddlLeibie" runat="server">
                </asp:DropDownList>
               
                <span id="_span1">
                    <asp:DropDownList ID="ddlSmall" runat="server">
                    </asp:DropDownList>
                    <asp:Button ID="btnSet" runat="server" Text="设置" Width="113px" /></span>
            
        </asp:Content>

代码文件:setType.aspx.cs

需要有以下几个引用

using System.IO;
using System.Globalization;
using System.Reflection;

并且此文件类的基类有两个,public partial class webAdmin_setType : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
要实现回调就需继承ICallbackEventHandler类并重写其中的两个方法GetCallbackResult()和RaiseCallbackEvent()

代码详细如下:

public partial class webAdmin_setType : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
    private string _callbackEventArgument;
    protected void Page_Load(object sender, EventArgs e)
    {
        ddlLeibie.Attributes.Add("onchange", "CallServer('FillLeibie|'+this.value,_span1)");
        Initpage();
    }
    #region ICallbackEventHandler Members
    /// <summary>
    /// 获取回调的参数,通过分析字符串,得出将在服务器端使用的方法(FillLeibie()),并在使用过该方法后返回值到客户端,返回一段HTML代码重写列表
    /// </summary>
    /// <returns></returns>
    public string GetCallbackResult()
    {
        string[] parts = _callbackEventArgument.Split('|');
        object[] args = null;
        string result = "";

        if (parts.Length > 1)
        {
            args = new object[parts.Length - 1];
            Array.Copy(parts, 1, args, 0, args.Length);
        }

        MethodInfo method = this.GetType().GetMethod(parts[0]);

        if (method != null)
        {
            result = (string)method.Invoke(this, args);
        }

        return result;
    }
    /// <summary>
    /// 获取从客户端提交的需调用服务器方法的信息,并赋值给一私有字段,再通过GetCallbackResult来分析该字段。
    /// </summary>
    /// <param name="eventArgument"></param>
    public void RaiseCallbackEvent(string eventArgument)
    {
        _callbackEventArgument = eventArgument;
    }

    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {
        this.RaiseCallbackEvent(eventArgument);
    }

    string ICallbackEventHandler.GetCallbackResult()
    {
        return this.GetCallbackResult();
    }

    #endregion

    public string FillLeibie(string lid)
    {
        ddlSmall.Items.Clear();
        FenLei f = new FenLei();
        ArrayList small=f.GetSmall(lid);
        char[] s ={ '|' };
        for (int i = 0; i < small.Count; i++)
        {
            string[] ss = small[i].ToString().Split(s);
            System.Web.UI.WebControls.ListItem a = new ListItem(ss[1], ss[0]);
            ddlSmall.Items.Add(a);
        }
        return RenderControl(ddlSmall);
    }
    private string RenderControl(Control control)
    {
        StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
        HtmlTextWriter writer2 = new HtmlTextWriter(writer1);

        control.RenderControl(writer2);
        writer2.Flush();
        writer2.Close();

        return writer1.ToString();
    }
    private void Initpage()
    {
        FenLei f=new FenLei();
        ArrayList leibie=f.GetLeibie();
        char[] s ={ '|' };
        ddlLeibie.Items.Add(new ListItem("请选择大类", "0"));
        for (int i = 0; i < leibie.Count; i++)
        {
            string[] ss = leibie[i].ToString().Split(s);
            System.Web.UI.WebControls.ListItem a = new ListItem(ss[1], ss[0]);
            ddlLeibie.Items.Add(a);
        }
        ddlSmall.Items.Add(new ListItem("请先选择大类", "0"));
    }
}

我的功能已经实现,在客户端不需刷新页面,就可以实时更新数据了,这有点像XMLHTTP

版权声明:本文为博主原创文章,未经博主允许不得转载。

AJAX与callback的区别(续asp.net2.0客户端回调的使用)

====================================================== 注:本文源代码点此下载 =============================...

ASP.NET 2.0客户端回调实例代码

  • 2008年05月20日 08:36
  • 2KB
  • 下载

使用ASP.NET2.0的ReportViewer查看RDLC报表

使用ASP.NET2.0的ReportViewer查看RDLC报表     [字体:大 中 小] 介绍: 这篇文章是前天看...

在ASP.Net2.0中使用UrlRewritingNet实现链接重写

很多时候我们需要链接转向(Url Rewriting),例如二级域名转向、文章访问链接等场合。让我们看两个例子:1 你现在看到的当前作者的博客园的域名:http://heekui.cnblogs.co...
  • hwenlee
  • hwenlee
  • 2011年03月07日 01:33
  • 72

Asp.Net2.0新GridView控件使用

原文地址:http://www.cnblogs.com/blueocean/articles/555855.html 一、Gridview中的内容导出到Excel   在日常工作中,经常要将g...

ASP.NET2.0中轻松实现网站换肤(App_Themes的使用)

轉:ASP.NET2.0中轻松实现网站换肤(App_Themes的使用)1.简介   新建App_Themes文件夹:    项目 - 右键 - 添加 - 添加ASp.net文件夹 - 主题利用The...

在asp.net2.0中使用Jquery调用Web Service

在asp.net2.0中使用Jquery调用Web Service2009-12-10来源:cnblogs.com 作者:麒麟 点击:569次 介绍:      我们都知道,默认情况下,一个asp.n...
  • hsg77
  • hsg77
  • 2011年06月16日 02:29
  • 946

Asp.net2.0中如何使用Ajax.dll

写这篇文章呢?只有一个原因! 因为我之前只会用Asp.net中自带的Ajax的控件实现Ajax! 我晕,我感觉很麻烦! 特别有时候页面本身不是Ajax页面的时候,布局又很乱的时候! 你压根不知...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net2.0中的客户端回调的使用
举报原因:
原因补充:

(最多只允许输入30个字)