当前位置: 首页 > 编程日记 > 正文

ASP.NET无刷新客户端回调

首先说一下:Page.ClientScript

用于管理脚本、注册脚本和向页添加脚本。

返回结果:一个 System.Web.UI.ClientScriptManager 对象。

ClientScriptManager对象 是一些 在 Web 应用程序中定义用于管理客户端脚本的方法,其中有一个方法重载:
string GetCallbackEventReference(Control control, string argument, string clientCallback, string context)
获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。
此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文。
参数:

           control: 处理客户端回调的服务器 System.Web.UI.Control。该控件必须实现
                        System.Web.UI.ICallbackEventHandler接口并提供
                        System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)方法

            argument: 从客户端脚本传递给服务器端的一个参数
                            System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)方法

            clientCallback: 一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果。

            context: 启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。
返回结果:    调用客户端回调的客户端函数的名称。


GetCallbackEventRefernce发送到了客户端的代码是这样的: 
                WebForm_DoCallback('__Page',message,ShowServerTime,context,null,false)
message:arg
ShowServerTime:ReceiveServerData

三种客户端回调方法:
第一种:添加 ServerTime.aspx 页面
前台代码:

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

<!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 language="javascript" type="text/javascript">
function GetServerTime()
{
var message
= '';
var context
= '';

<%=sCallBackFunctionInvocation%>
}
function ShowServerTime(timeMessage, context)
{
alert(
'现在服务器上的时间是:\n' + timeMessage);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<input type="button" value="得到服务器端时间" onclick="GetServerTime();" />
</form>
</body>
</html>

后台代码:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _3_ServerTime : System.Web.UI.Page, ICallbackEventHandler
//System.Web.UI.ICallbackEventHandler
//一定要实现ICallbackEventHandler接口,用于指示控件可以作为服务器的回调事件的目标。
{
public string sCallBackFunctionInvocation;

protected void Page_Load(object sender, EventArgs e)
{
sCallBackFunctionInvocation
=
Page.ClientScript.GetCallbackEventReference(
this, "message", "ShowServerTime", "context");
//因为它会返回个ClientScriptManager, ClientScriptManager管理所有的客户端脚本。
//然后在前台某个按钮的onclick事件里<%=那个public后台字符串% >.
//此方法 发送到客户端代码是:WebForm_DoCallback('__Page',message,ShowServerTime,context,null,false)
}

public void RaiseCallbackEvent(string eventArgument)
{
// ICallbackEventHandler接口 要实现的方法
// 处理以控件为目标的回调事件。
// 参数:
// eventArgument:
// 一个字符串,表示要传递到事件处理程序的事件参数。
}

public string GetCallbackResult()
{
// ICallbackEventHandler接口 要实现的方法
// 返回以控件为目标的回调事件的结果。
//
// 返回结果:
// 回调的结果。
return DateTime.Now.ToString();
}
}

第二种方法:前台异步调用后台

在上面的方法中我们必须要在前台绑定后台,那么如果不绑定呢?我们怎么做:
直接把GetCallbackEventReference当做js函数中的一个实现内容,然后把这个js函数注册到客户端。
新建页面TestPage.aspx

前台代码:

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

<!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 test()
{
var lb
= document.getElementById("Select1");
//取的那个下拉框
var con = lb.options[lb.selectedIndex].text;
//得到你选择的下拉框的文本再调用呢个CallTheServer,是一个由服务器端输出的js函数
CallTheServer(con,''); //此方法由 后台生成到前台来
}
function ReceiveServerData(rValue)
{
Results.innerHTML
= rValue;
//在<span id="Results"></span>添加由后台生成的方法 CallTheServer(con,'');
}
</script>

</head>
<body>
<form id="form1" runat="server">
<div>
<select id="Select1">
<option value='1' selected="selected">老鼠徒弟</option>
<option value='2'>吴旗娃师傅</option>
</select>
<br />
<br />
<input onclick="test()" value="从服务器返回下拉框文本" type='button'/>
<br />
<br />
<span id="Results"></span>
<br />
</div>
</form>
</body>
</html>

后台代码:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _3_TestPage : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
String cbReference
= Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
String callbackScript;
callbackScript
= "function CallTheServer(arg,context)" +
"{ " + cbReference + "} ;";
Page.ClientScript.RegisterStartupScript(
this.GetType(), "abcdefg", callbackScript, true);
//第四个参数代表是不是要自动给着脚本加上<script type="text/javascript"></script>标记,当然要加啊

}

private string SelectValue;
public void RaiseCallbackEvent(string eventArgument)
{
// ICallbackEventHandler接口 要实现的方法
// 处理以控件为目标的回调事件。
// 参数:
// eventArgument:
// 一个字符串,表示要传递到事件处理程序的事件参数。
SelectValue = eventArgument;
}

public string GetCallbackResult()
{
// ICallbackEventHandler接口 要实现的方法
// 返回以控件为目标的回调事件的结果。
//
// 返回结果:
// 回调的结果。
return "你选择的是:" + SelectValue;
}
}

第三种:前面两种都是<input type="button"的html控件,那么如果是WEB按钮控件呢?当然也可以,在后台添加服务器按钮的onclick 属性。
新建 third.aspx 页面
前台代码:

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

<!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>
</head>
<body>
<form id="form1" runat="server">
<div>
<select id="Select1">
<option selected="selected" value='1'>老鼠徒弟</option>
<option value='2'>吴旗娃师傅</option>
</select>
<asp:Button ID="Button1" runat="server" Text="这是个服务器按钮" />
</div>

<div id="div1" />

<script type="text/javascript">
function Re(ret)
{
document.getElementById(
"div1").innerHTML = ret;
alert(ret);
}
</script>
</form>
</body>
</html>

后台代码:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _3_third : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
//第四个参数为null,因为你不可能再在js中给他传参数了
string str = Page.ClientScript.GetCallbackEventReference(this,
"document.getElementById('Select1').options[document.getElementById('Select1').selectedIndex].text",
"Re", null);
//return false是为了防止提交窗体
Button1.Attributes.Add("onclick", str + ";return false;");
}

private string SelectValue;
public void RaiseCallbackEvent(string eventArgument)
{
// ICallbackEventHandler接口 要实现的方法
// 处理以控件为目标的回调事件。
// 参数:
// eventArgument:
// 一个字符串,表示要传递到事件处理程序的事件参数。
if (eventArgument == "老鼠徒弟")
{
SelectValue
= "老鼠徒弟:人生如鼠,不在仓就在厕!";
}
else
{
SelectValue
= "吴旗娃师傅:自信自强,乐观向上";
}
}

public string GetCallbackResult()
{
// ICallbackEventHandler接口 要实现的方法
// 返回以控件为目标的回调事件的结果。
//
// 返回结果:
// 回调的结果。
return SelectValue;
}
}

小技巧,当你写完System.Web.UI.ICallbackEventHandler后,把鼠标移上去,那么System前面'S'下面会有个小红线,点他会自动写好那个RaiseCallbackEvent代码。

相关文章:

common lisp里的几个操作符

setf 赋值操作符&#xff0c;定义一个全局变量。返回值是最后一个赋值的结果。 let 局部变量操作符。let表达式有两部分组成。第一部分是任意多的变量赋值&#xff0c;他们被包裹在一个()中&#xff0c;第二部分是任意数量的表示式作为 let 的函数体。let 表达式的返回值为 最…

敏捷宣言遵循的十二条原则

敏捷宣言遵循的十二条原则Twelve Principles behind the Agile Manifesto 我们遵循以下原则&#xff1a; We follow these principles: 我们最重要的目标&#xff0c;是通过持续不断地及早交付有价值的软件使客户满意。Our highest priority is to satisfy the customer throug…

微信公众号开发的一些配置

1、开发者ID&#xff08;AppID&#xff09; 开发者ID是公众号开发识别码&#xff0c;配合开发者密码可调用公众号的接口能力。 2、开发者密码&#xff08;AppSecret&#xff09; 开发者密码是校验公众号开发者身份的密码&#xff0c;具有极高的安全性。切记勿把密码直接交给第三…

javascript-对混合字母/数字数组进行排序

[A1, A10, A11, A12, A2, A3, A4, B10, B2, F1, F12, F3]将其排序为&#xff1a; [A1, A2, A3, A4, A10, A11, A12, B2, B10, F1, F3, F12] var reA /[^a-zA-Z]/g; var reN /[^0-9]/g;function sortAlphaNum(a, b) {var aA a.replace(reA, "");var bA b.replace…

国王验毒酒问题

国王召开宴会&#xff0c;一共有1000桶葡萄酒。邪恶的刺客在其中一桶酒里下了致命的毒。人们只知道有且仅有一桶酒被下毒&#xff0c;却不知道是哪一桶。现在你可以拿小白鼠做实验&#xff0c;小白鼠可以同时喝下多个桶的取样结果&#xff0c;且无视稀释效果喝到就死&#xff0…

Nodejs核心模块之net和http的使用详解

前言 net和http模块都是node核心模块之一&#xff0c;他们都可以搭建自己的服务端和客户端&#xff0c;以响应请求和发送请求。 net模块服务端/客户端 这里写的net模块是基于tcp协议的服务端和客户端&#xff0c;用到net.createServer和net.connect实现的一个简单请求与响应的d…

NODEJS 使用 XLSX模块导出excel文件

参考&#xff1a;https://www.itranslater.com/qa/details/2582439815438402560 生成excel /*** 用于排序* param a* param b* returns {number}*/ function sortAlphaNum(a, b) {let reA /[^a-zA-Z]/g;let reN /[^0-9]/g;let aA a.replace(reA, "");let bA b.re…

poj 3352

题意&#xff1a;一个连通的无向图&#xff0c;求至少需要添加几条边&#xff0c;救能保证删除任意一条边&#xff0c;图仍然是连通的。 思路&#xff1a;边的双连通图。其实就是要求至少添加几条边&#xff0c;可以使整个图成为一个边双连通图。用tarjan算法(求割点割边)求出l…

oracle删除大表的数据的方法

今天在公司中碰到访问表数据(test 表)速度非常慢&#xff0c;简单的一个select 语句花了10多分钟&#xff0c; 后来查询一下表的数据量&#xff0c;一共有278万多条数据&#xff0c;而且这个数据表的数据大都过期了&#xff0c;对于现在的业务没什么用。可悲的是这个表竟然也没…

ClickHouse 学习

DDL 添加数据库字段 alter table user_tags add column last_subject String; alter table user_tags add column class_trust_valids Int8; 删除列 ALTER TABLE [db].name [ON CLUSTER cluster] DROP COLUMN ... 日期函数 当toDate 遇到空的串报异常时 select toDate();…

zTree实现节点修改的实时刷新

一、应用场景 在实际应用中会遇到动态操作树各节点的需求&#xff0c;在增加树节点后如何实时动态刷新树就十分有必要了。二、项目实践 比如要在test1234节点下新建子节点&#xff0c;首先要选中test1234节点&#xff0c;添加成功后&#xff0c;根据test1234结点的TID去后台请求…

magento常用软件

常见问题&#xff1a; 1. 装完插件导致后台配置出现 Access denied 信息&#xff0c;需要重置账号权限&#xff0c;方可恢复正常。 2. 大多数无法安装插件时&#xff0c;请删除 /downloader/pearlib/pear.ini 文件&#xff0c;最后到 Connect Manager 里保存下设置&#…

连接惠普打印机(通过WIFI)

第一步 找到打印机型号 第二步 到惠普官方网站下载对应驱动 第三步 安装驱动 第四步 安装驱动后选择WIFI连接&#xff08;IP在打印机显示屏幕上显示&#xff0c;如果输入打印机屏幕IP连接失败&#xff1b;需要获取打印机真正的IP地址&#xff0c;在HP设备工具箱中获取&#xff…

ADO.NET的连接模式

1、连接模式&#xff1a;客户机一直保持和数据库服务器的链接&#xff0c;适合数据传输量少&#xff0c;系统规模不大、客户机和服务器在同一网络内的环境。 使用连接模式下数据访问的步骤如下&#xff1a; a、使用connection对象连接数据库 b、使用command&#xff08;命令&am…

App调用safar

/调用safar打开网页 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:"http://www.cnblogs.com/foxmin"]]; 调用app store (省略号后面加的是产品的id等一些参数) // [[UIApplication sharedApplication] openURL:[NSURL URLWithString:"i…

Spring Boot 整合Redis 实现缓存

本文提纲一、缓存的应用场景二、更新缓存的策略三、运行 springboot-mybatis-redis 工程案例四、springboot-mybatis-redis 工程代码配置详解运行环境&#xff1a;Mac OS 10.12.xJDK 8 Redis 3.2.8Spring Boot 1.5.1.RELEASE一、缓存的应用场景 什么是缓存&#xff1f;在互联网…

Sqlite3支持的数据类型 日期函数 Sqlite3 函数

Sqlite3支持的数据类型 NULL INTEGER REAL TEXT BLOB 但实际上&#xff0c;sqlite3也接受如下的数据类型&#xff1a; smallint 16 位元的整数。 interger 32 位元的整数。 decimal(p,s) p 精确值和 s 大小的十进位整数&#xff0c;精确值p是指全部有几个数(digits)大小值&…

Element el-switch 组件样式修改 将文字显示到组件内

Element el-switch 现在的样式无法将文字显示到组件内 &#xff0c;需要自己修改样式。具体如下 <el-switch:disabled"sitem.select.length-1"class"switch"v-model"sitem.or"active-color"#13ce66"inactive-color"#409EFF&qu…

jquery中输入验证中一个不错的效果

在表单的输入验证中&#xff0c;经常要当用户没能正确输入后&#xff0c;要提示“XXXX输入错误”这一类的信息&#xff0c;如何能搞到动态一点呢&#xff0c;今天发现jquery中的一个不错的效果&#xff0c;笔记之。 1 包含jquery <script src"images/jquery-1.2.6.min…

【2018.2.25】c++预习练习

学了一学期c语言之后预习c&#xff0c;一些最基础的东西做起来还是得心应手的&#xff0c;先练练手感?C primer plus 和教材同步学习&#xff0c;大概会比上学期抓瞎学习要好得多吧。 1 #include<iostream>2 int main()3 {4 using namespace std;5 cout <<…

在做项目中遇到的JS问题

name和value&#xff1a; 例如: <input type"text" name"txt"/> name用于定义这个input收到的值的变量名&#xff0c;在上面的input输入“hello",那么就有txt"hello";用于dom操作取值 在用js改变某个div属性进行传值操作时&#xff0…

用Duplex实现消息广播

http://blog.csdn.net/fangxinggood/archive/2011/01/15/6142861.aspx WCF中定义3种消息交换模式&#xff1a; 1. Request/Reply; 2. One-Way; 3. Duplex。 Request/Reply 是缺省模式&#xff0c;即同步调用。在调用服务方法后需要等待服务的消息返回&#xff0c;即便该方法返…

mongoose手动生成ObjectId

如果需要手动生成使用mongoose.Types.ObjectId()方法。 var mongoose require(mongoose); var id mongoose.Types.ObjectId();

Coolpad F61刷机解锁成功

这几天是高校开学的日子,各大运营商纷纷进驻校园,打出种种优惠,抢新鲜用户。 我一直觉得我现在的移动号码收费太贵,每个月不知不觉就是100多块,对我这个以公司为家(公司电话就是我的电话)的宅人而言,是有点夸张了。特别是和国外的运营商相比&#xff0c;如果你有朋友在国外&…

Django 数据库

一、操作数据库 Django配置连接数据库&#xff1a; 在操作数据库之前&#xff0c;首先先要连接数据库。这里我们以配置MySQL为例来讲解。Django连接数据库&#xff0c;不需要单独的创建一个连接对象。只需要在settings.py文件中做好数据库相关的配置就可以了。示例代码如下&…

MapReduce 中 UDF、UDAF、UDTF

UDF UDF只能实现一进一出的操作&#xff0c;如果需要实现多进一出&#xff0c;则需要实现UDAFUDF函数可以直接应用于select语句&#xff0c;对查询结构做格式化处理后&#xff0c;再输出内容 UDAF UDFA是用户自定义的聚类函数&#xff0c;是基于表的所有记录进行的计算操作 …

计算机网络面试知识总结1

1.TCP报头格式 TCP协议头至少20个字节 &#xff08;1&#xff09;源端口 16位&#xff0c;主要用于标志报文的返回地址&#xff0c;其中包含初始化通信的端口 &#xff08;2&#xff09;目的端口 16位&#xff0c;指明了要把数据传送到哪 &#xff08;3&#xff09;序列号 32位…

C# 导出到Excel (使用NPOI 1.2.4)

最近研究下用C#导出Excel。最后选择要用NPOI来导出。在网上看到了好多的教程啊。于是我兴奋的模仿起来了。先创建个空的excel试试吧。结果&#xff1a;提示无法将类型“NPOI.SS.UserModel.Sheet”隐式转换为“NPOI.HSSF.UserModel.HSSFSheet”。存在一个显式转换(是否缺少强制转…

Putty 工具 保存配置的 小技巧

用Putty 已经很长时间了&#xff0c;但一直被一个问题困扰&#xff0c;有时候是懒得去弄&#xff0c;反正也不怎么碍事&#xff0c;今天小研究了下&#xff0c;把这个问题解决了&#xff0c;心里也舒服了。 Putty是一个免费小巧的Win32平台下的telnet,rlogin和ssh客户端。 它的…

PyODPS 学习 实现查询数据 并更新数据

PyODPS是MaxCompute的Python版本的SDK&#xff0c;提供简单方便的Python编程接口。PyODPS支持类似Pandas的快速、灵活和富有表现力的数据结构。您可以通过PyODPS提供的DataFrame API使用Pandas的数据结果处理功能。本文用于帮助您快速开始使用PyODPS&#xff0c;并且能够用于实…