【第22期】观点:IT 行业加班,到底有没有价值?

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.net2.0中使用客户端回调实现无刷新应用!

在asp.net1.1中我们可以通过JS调用Web服务来实现无刷新应用,现在asp.net2.0可以用Client Callback的方法实现,这样变得更加方便和容易使用了.客户端回调功能的实现需要两...

Asp.Net2.0无刷新客户端回调

Asp.Net2.0无刷新客户端回调(笔记) 按照 一帆(老鼠粮仓之路) 的文章,在2005正式版,有些不能实

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

使用asp.net 2.0 客户端回调功能显示后台处理进度

今天试着用.net2.0的客户端回调功能做了个后台进度显示,也可以改成进度条,进度值用session保存,主要处理过程使用线程,用FOR循环模拟,回调返回循环进度值。如图:   Default.asp...

Asp.Net2.0无刷新客户端回调

Asp.Net2.0无刷新客户端回调(笔记) 按照 一帆(老鼠粮仓之路) 的文章,在2005正式版,有些不能实现,譬如方法R

ASP.NET2.0实现无刷新客户端回调

Asp.Net2.0的客户端回调是一种很让人激动的方法,他能够让我们控制要提交什么数据给服务器而不用提交整个页面,同时服务器也只返回你所需要的数据而不要发回整个页面。  首先我们要说一个很重要的方法:...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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