惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
腾讯CDC
S
SegmentFault 最新的问题
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Hacker News
The Hacker News
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
B
Blog
IT之家
IT之家
Spread Privacy
Spread Privacy
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cisco Blogs
Recent Announcements
Recent Announcements
H
Hacker News: Front Page
AI
AI
I
InfoQ
H
Heimdal Security Blog
T
Threatpost
Cisco Talos Blog
Cisco Talos Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
W
WeLiveSecurity
SecWiki News
SecWiki News
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
O
OpenAI News
阮一峰的网络日志
阮一峰的网络日志
T
Troy Hunt's Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
雷峰网
雷峰网
T
Tor Project blog
有赞技术团队
有赞技术团队
Schneier on Security
Schneier on Security
Last Week in AI
Last Week in AI

博客园 - 宽田

SQLite在.NET中自适应32位/64位系统 OWIN是什么? 好的用户界面-界面设计的一些技巧 Android模拟器连接本李服务器localhost win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法 Js 验证中文字符长度 Javascript技巧 解释器模式(interpreter): 访问者模式(Visitor) 职责链模式(Chain of Responsibility) Web Service 中返回DataSet结果大小改进 通用数据链接(UDL)的用法 ORACLE WITH AS 用法 Oracle REGEXP_INSTR 用法 C# 实现自定义事件 错误:200, Stream not found, NetStream.Play.StreamNotFound, clip: '[Clip] wcf Svcutil用法 IIS 增加net.tcp绑定 客户端字符集NLS_LANG
GetCallbackEventReference(客户端调用服务器端)的用法
宽田 · 2012-05-23 · via 博客园 - 宽田

    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, nullnull);

    此函数的代码会自动下载到客户端并通过<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中被寄予厚望的功能。

例,单击按钮得到服务器端处理后的结果:

 

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GetCallbackEventReferenceUse._Default" %> 
<!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">
<head runat="server">
    <title></title>
    <script type="text/javascript">
        //服务器端呼叫客户端方法
        function ClientReferenceServerData(returnValue) {
            alert(returnValue);
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        传给服务器参数:
        <input id="txbServerParameter" type="text" />
        <input id="btnCallServer" type="button" value="CallServer" onclick="ClientCallServer()" />
    </div>
    </form>
</body>
</html>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;

namespace GetCallbackEventReferenceUse
{
    public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
    {
        private string callBackResult = string.Empty;
        protected void Page_Load(object sender, EventArgs e)
        {
            //产生客户端调用服务器端的方法脚本
            string reference = Page.ClientScript.GetCallbackEventReference(this,
                "document.getElementById('txbServerParameter').value",
                "ClientReferenceServerData""");

            //客户端调用服务器端方法
            string callbackScript = "function ClientCallServer()" +
              "{" +
                    reference
              + ";}";
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ClientCallServer", callbackScript, true);
        }

        //返回结果
        public string GetCallbackResult()
        {
            return "Server result: " + callBackResult;
        }

        //回调时事件
        
//eventArgument值与 Page.ClientScript.GetCallbackEventReference中的"document.getElementById('txbServerParameter').value"对应
        public void RaiseCallbackEvent(string eventArgument)
        {
            callBackResult = eventArgument;
        }

    }

参考:http://www.cnblogs.com/mywebname/articles/1060383.html