GetCallbackEventReference的用法

GetCallbackEventReference函数在 .NET Framework 2.0 版中是新增的。

MSDN解释:获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文。
函数原型:
public string GetCallbackEventReference (
 Control control,
 string argument,
 string clientCallback,
 string context
)


第一个参数指定了服务器端将要处理回调的目标对象,即处理客户端回调的服务器端控件。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
    如果传入的是this,则表示页面本身。也可以传入任何实现了ICallbackEventHandler的页面控件(page control)的引用。
    在任何情况下,客户端的提交动作(submit action)会提交至和标准回传(postback)机制相同的ASPX页面。
第二个参数是一个JavaScript常量表达式,表示页面传给服务器的输入数据。如将一个下拉列表当前选中元素的值传入"document.getElementById['cboEmployees'].value":。
第三个参数是一个用户定义在<script>块中的JavaScript回调(callback)函数名。回调(callback)执行后,此函数最终负责页面的更新。
最后两个可选参数可用来指定错误处理函数(error handler)和上下文对象(context object)。

GetCallbackEventReference函数将产生如下的脚本调用:
WebForm_DoCallback(pageID, input, UpdateEmployeeViewHandler, null, null);
此函数的代码会自动下载到客户端并通过<script>标签添加到页面响应(page's response)中。WebForm_DoCallback 使用XmlHttpRequest DOM对象(XmlHttpRequest DOM object)回调(call back)当前页面的URL。
与此同时,它会添加一些额外的隐藏域(hidden field)以便服务器区分更简单的轻量级回调(callback)请求和一般回传(postback)请求。
处理请求时,ASP.NET运行时(runtime)标识出调用的目标对象(传给GetCallbackEventReference的第一个参数),确认它实现了ICallbackEventHandler接口后调用RaiseCallbackEvent方法:
void RaiseCallbackEvent (
 string eventArgument
)
eventArgument一般即是通过GetCallbackEventReference指定的页面传递到服务器端的输入数据,即参数2
RaiseCallbackEvent处理完毕,即通过调用
public string GetCallbackResult()
将处理结果返回给调用控件,交由客户端执行GetCallbackEventReference指定的客户端脚本clientCallback,由其完成客户端刷新。

上面说过,脚本回调(script callback)并不适用于所有浏览器,尽管最新的浏览器,包括Internet Explorer 5+, Netscape 6+, and Safari1.2+都能行。
Microsoft在ASP.NET 2.0中加入了两个新的browser bapabilities:SupportsXmlHttp 与SupportsCallback以便开发人员检查方案的可行性。
一条让页面刷新更快的告诫
尽管脚本回调(script callback) 定义在ASP.NET 2.0中,要使其在ASP.NET 1.1里工作也并不很困难。在ASP.NET 2.0中,很多服务器控件(server control)借助脚本回调(script callback)提供了更迅速的页面刷新。
最突出的例子也许是GridView控件(GridView control),作为DataGrid的接班人,选择性地运用脚本回调(script callback)实现分页显示记录。
正如前面所说,脚本回调(script callback)依赖于文档对象模型(DOM)的XmlHttpRequest对象。在Internet Explorer中,此文档对象模型对象(DOM object)通过ActiveX控件(ActiveX control)实现——Microsoft.XmlHttp。
在IE中浏览这样的页面时,你必须适当降低安全设置以允许ActiveX控件(ActiveX control)能被脚本调用。在其他以同样方式实现XmlHttpRequest文档对象模型对象(DOM object)的浏览器中,这是不必要的。
事实上,基于Mozilla的浏览内置支持了HTTP请求功能器,而没用使用ActiveX控件(ActiveX control)——这也是在Internet Explorer 7.0中被寄予厚望的功能。

下面简单例子可作参考:
服务器端


public partial class _Default : System.Web.UI.Page , ICallbackEventHandler
{
    private string callbackResult = string.Empty;
    private string s = string.Empty;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ClientScriptManager csManager = Page.ClientScript;
            string callbackMethod = csManager.GetCallbackEventReference(this, "document.getElementById('txtNow').value", "JS_OnClickFunc", "this.value");
            txtNow.Attributes.Add("OnClick", callbackMethod);
        }
    }

    ICallbackEventHandler 成员#region ICallbackEventHandler 成员

    public string GetCallbackResult()
    {
        return callbackResult;
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        callbackResult = eventArgument + System.DateTime.Now.ToString();
    }

    #endregion
}

客户端


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html>
<head runat="server">
    <title>无标题页</title>
    <script language="javascript">
    function JS_OnClickFunc(a)
    {
        document.getElementById("txtNow").value = a;
    }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="txtNow" runat="server" ></asp:TextBox>
    </div>
    </form>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值