.net GetCallbackEventReference参数说明和详细使用

来源:互联网 发布:金域名人大酒店 编辑:程序博客网 时间:2024/05/29 15:13
 

GetCallbackEventReference函数在 .NET Framework 2.0 版中是新增的。 在.NET Framework 4.0中提供的有四种重写方法

第一种函数原型为:

public string GetCallbackEventReference (

 string target             //指定的目标,不与control共同使用,一般用this代替当前目标
 Control control,       //页面控件,一般用this代替

 string argument,       //js脚本常量,可通过document.getElementById['']获取元素值,也可以直接写成传递的参数
 string clientCallback,  //回调成功后的页面刷新函数,一般直接写函数名称
 string context            //上下文对象一般不写

 bool useAsync                  //是否使用异步,一般设置为true

string clientErrorCallBack   //是否设置了错误处理程序

 

)

第一个参数指定了服务器端将要处理回调的目标对象,即处理客户端回调的服务器端控件。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
    如果传入的是this,则表示页面本身。也可以传入任何实现了ICallbackEventHandler的页面控件(page control)的引用。
    在任何情况下,客户端的提交动作(submit action)会提交至和标准回传(postback)机制相同的ASPX页面。
第二个参数是一个JavaScript常量表达式,表示页面传给服务器的输入数据。

第三个参数是一个用户定义在<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)的浏览器中,这是不必要的。

js代码:

//用于操作后的提示

function ReceiveServerData(a) {
    if (a == "True") {
        alert("操作成功!");location.reload();
    } else { alert("操作失败,请刷新后再试!") }
}

//回调的操作

$("#btnDisable").click(function () {
        if ($(":input[id^='chk_']:checked").length > 0) {
            if (confirm("确定要暂停选中的数据吗?")) {
                var a = ""; $(":input[id^='chk_']:checked").each(function () {
                    a += this.id.substring(4) + ","
                });
                CallServer("Dis|" + a.substring(0, a.length - 1))    //回调函数,值传递id的一部分
            }
        } else { alert("请选择要暂停的数据!") }
    });
    $("#btnEnabled").click(function () {
        if ($(":input[id^='chk_']:checked").length > 0) {
            if (confirm("确定要发布选中的数据吗?")) {
                var a = ""; $(":input[id^='chk_']:checked").each(function () { a += this.id.substring(4) + "," });
                CallServer("Ena|" + a.substring(0, a.length - 1))
            }
        } else { alert("请选择要发布的数据!") }
    })

 aspx页面:

    #region ICallbackEventHandler
        private bool returnValue;
        private void RegisterCallBack()
        {
            ClientScript.RegisterClientScriptBlock(GetType(), "CallServer", "function CallServer(arg) {" + ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "") + "}", true);
        }
        public string GetCallbackResult()
        {
            return returnValue ? bool.TrueString : bool.FalseString;
        }
        public void RaiseCallbackEvent(string eventArgument)
        {
            string[] arg = eventArgument.Split('|');
            switch (arg[0])
            {
                case "Dis":
                    returnValue = bll.PauseRelease(arg[1]);
                    break;
                case "Ena":
                    returnValue = bll.ResumeRelease(arg[1]);
                    break;
                  }
        }
        #endregion

原创粉丝点击