您的位置:首页 > Web前端

非Ajax无刷之ClientScript.GetCallbackEventReference

2011-02-24 10:44 429 查看
以前使用无刷,只有两种办法,一种使用JS,另一种则使用AJax,使用起比较方便,但与后台的交互不是很好,直到我今天发现ClientScript.GetCallbackEventReference,才发现asp.net真正的强大之处,下面我就来简单介绍一下这个方法的使用

首先,要使用这个方法,必有继承一个接口:ICallbackEventHandler,

接口里面两个方法如下:

// 摘要:
// 返回以控件为目标的回调事件的结果。
//
// 返回结果:
// 回调的结果。
string GetCallbackResult();
//
// 摘要:
// 处理以控件为目标的回调事件。
//
// 参数:
// eventArgument:
// 一个字符串,表示要传递到事件处理程序的事件参数。
void RaiseCallbackEvent(string eventArgument);



看说明很详细,我们的页面里面必有实现这个方法与前台交互,这下就方便了呀!下面再介绍一下ClientScript.GetCallbackEventReference用法,这个方法是在前台实现,看代码比较清楚:

<script type="text/javascript">

//需要调用这个方法启用后台方法

//arg与context为前台需要传递给后台的参数,好好利用吧
function CallServer(arg, context)
{

//this不用说了

//arg是后台能接收到的方法,也是后台返回来的值

//ReceiveServerData为后台执行完成后,前台执行的方法

//context参数原封不动传给ReceiveServerData
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
}



//这个方法就是你要执行的前台操作,可以返回结果,也可以改变控件状态,自己喜欢吧~
function ReceiveServerData(result, context)
{
...
}
</script>

有了这两个方法之后,就可以大做文章了呀~~你的无刷是不是变得简单了呢?下面拿一下两级下拉的实例给大家参考一下吧~

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Callback.aspx.cs" Inherits="Callback" %>

<!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">

<mce:script type="text/javascript"><!--
   function CallServer(arg, context)
   {
        context.innerHTML = "Loading"; 
        <%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context") %>;
    }

    function ReceiveServerData(result, context)
    {
        context.innerHTML = result;
    }
// --></mce:script>

<head runat="server">
    <title>Callback</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString1 %>"
                SelectCommand="SELECT [CategoryID], [CategoryName] FROM [Categories]">
            </asp:SqlDataSource>
            <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString1 %>"
                SelectCommand="SELECT [ProductID], [ProductName] FROM [Products] WHERE ([CategoryID] = @CategoryID)">
                <SelectParameters>
                    <asp:ControlParameter ControlID="ddlCategory" Name="CategoryID" 
                          PropertyName="SelectedValue" />
                </SelectParameters>
            </asp:SqlDataSource>
            <div id="_div1" runat="server">
                <asp:DropDownList ID="ddlCategory" runat="server" 
                    DataSourceID="SqlDataSource1" DataTextField="CategoryName"
                    DataValueField="CategoryID" AppendDataBoundItems="True">
                    <asp:ListItem Value="">- Select Category -</asp:ListItem>
                </asp:DropDownList>
                <span id="_span1">
                    <asp:DropDownList ID="ddlProduct" runat="server" 
                        DataSourceID="SqlDataSource2" DataTextField="ProductName"
                        AppendDataBoundItems="True">
                        <asp:ListItem Value="">- Select Product -</asp:ListItem>
                    </asp:DropDownList>
                </span><span id="_span2">
                    <asp:Button ID="btnBuy" runat="server" Text="Buy" Enabled="false" OnClick="btnBuy_Click" />
                    <br />
                </span>
            </div>
            <asp:Label ID="Label1" runat="server"></asp:Label>
        </div>
    </form>
</body>
</html>


using 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
{
    private string _callbackEventArgument;

    protected void Page_Load(object sender, EventArgs e)
    {
        ddlCategory.Attributes.Add("onchange", "CallServer('FillProduct|'+this.value,_span1)");
        ddlProduct.Attributes.Add("onchange", "CallServer('ShowBuy|'+this.value,_span2)");
    }

    ICallbackEventHandler Members#region ICallbackEventHandler Members

    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;
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        _callbackEventArgument= eventArgument;
    }

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

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

    #endregion

    public string FillProduct(string categoryID)
    {
        ddlCategory.SelectedValue = categoryID;
        ddlProduct.DataBind();

        return RenderControl(ddlProduct);
    }

    public string ShowBuy(string ProductID)
    {
        btnBuy.Enabled = !string.IsNullOrEmpty(ProductID);

        return RenderControl(btnBuy);
    }

    protected void btnBuy_Click(object sender, EventArgs e)
    {
        _div1.Visible = false;
        Label1.Text = "Buy: " + Request.Form[ddlProduct.UniqueID];
    }

    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();
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: