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

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

【ASP.NET】Win7下ASP.NET的配置,Helloworld,发布网站

Win7下配置ASP.NET环境与配置ASP(VbScript)极其类似,毕竟大家都是微软的产品,在2003年ASP.NET诞生之前,用Windows做服务器来写网页的,几乎清一色都是ASP。 其实...
  • yongh701
  • yongh701
  • 2016年01月07日 17:54
  • 1718

VS2005和ASP.NET2.0中使用强类型数据

一、 简介   作为开发人员,当我们在学习新技术时,例子可能是我们最大的敌人。而教程往往设计得易于理解,但是同时,它们常常加固了懒惰,低效性,甚至于危险的编码习惯。再也没有比ADO.NET示例更...
  • u011877729
  • u011877729
  • 2013年08月29日 19:24
  • 287

配置asp.net 2.0的项目到IIS7

首先碰到以下问题: 无法读取配置节"system.web.extensions",因为它缺少节声明 在微软的论坛找到了解决的办法: http://forums.asp.net/p/1...
  • orichisonic
  • orichisonic
  • 2015年11月10日 13:54
  • 593

TortoiseSVN客户端入门使用教程

一直觉得,TortoiseSVN客户端使用很方便。当新员工入职后,总是要讲解一番基本操作。写了一个文档,介绍常用命令,这样一来新同事可以随时查找,另一方面,我也可以抽出时间来做其它事情。后期还是会陆续...
  • gwzz1228
  • gwzz1228
  • 2014年06月26日 19:24
  • 12894

Git客户端(Windows系统)的使用

本文环境: 操作系统:Windows 32 Bit Git客户端:TortoiseGit-1.8.16.0 / v2.0+ 一、安装Git客户端 ...
  • xiaobin_HLJ80
  • xiaobin_HLJ80
  • 2013年09月03日 02:15
  • 80319

github客户端使用简易教程

第一步:上github官网注册帐号并通过邮箱认证即可!! 第二步,下载客户端,这里直接给大家一个离线安装包接:http://download.csdn.net/download/lyg46808...
  • sinat_23338865
  • sinat_23338865
  • 2016年10月11日 17:40
  • 6925

Git客户端使用指南

Git使用注意事项关于Git的一些知识,开源中国给了详细教程,OSChinaGit开源中国提供了Git服务,可以建立私有仓库,而且在速度上比国外的github要快很多。OSChinaGit基于 Git...
  • Alex_wsc
  • Alex_wsc
  • 2016年10月07日 15:08
  • 1996

asp.net2.0使用ajax的timer去定时刷新

www.ebay.com/cln/8-11226/2014-12-03/139529828010 www.ebay.com/cln/8-11226/2014-12-03/139529850010 ...
  • yth126
  • yth126
  • 2014年12月03日 10:48
  • 11

Cocoapods客户端的使用

下载安装好客户端,打开如下: Get started with CocoaPods : 是关于CocoaPods客户端的引导介绍 Search for Pods : 这个界面用来搜...
  • ruiruistyle__
  • ruiruistyle__
  • 2017年04月17日 16:25
  • 200

ASP.NET2.0轻松搞定统计图表

主页:http://blog.csdn.net/21aspnet/           时间:2007.3.27 本文讲述如何绘制条形图,折线图,柱形图,面积图等常见图形。 效果图: ...
  • jsjpanxiaoyu
  • jsjpanxiaoyu
  • 2015年03月22日 01:23
  • 1481
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net2.0中的客户端回调的使用
举报原因:
原因补充:

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