在 ASP.NET 网页中不经过回发而实现客户端回调

一、使用回调函数的好处

在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致回发的一些其他操作。此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器。但是,在有些情况下,需要从客户端运行服务器代码,而不执行回发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外,页回发会导致处理开销,这会降低性能,且会让用户不得不等待处理并重新创建页。

若要避免丢失客户端状态并且不导致服务器往返的处理开销,可以对 ASP.NET 网页编码,使其能执行客户端回调。在客户端回调中,客户端脚本函数会向 ASP.NET 网页发送一个请求。该网页运行其正常生命周期的修改版本 — 初始化页并创建其控件和其他成员,然后调用特别标记的方法。该方法执行代码中编写的处理过程,然后向浏览器返回可由另一客户端脚本函数读取的值。在此过程中,该页一直驻留在浏览器中。

二、客户端回调组件

创建实现客户端回调的 ASP.NET 页与创建任何 ASP.NET 页类似,但也有如下这些区别。页的服务器代码必须:

  • 实现 ICallbackEventHandler 接口。可以向任何 ASP.NET 网页添加此接口声明。
  • 提供 RaiseCallbackEvent 方法的实现。此方法将被调用以对服务器执行回调。
  • 提供 GetCallbackResult 方法的实现。此方法会将回调结果返回给客户端。

此外,该页还必须包含执行以下操作的三个客户端脚本函数:

  • 一个函数调用帮助器方法,该方法执行对服务器的实际请求。在此函数中,可以首先执行自定义逻辑以准备事件参数,然后可以将一个字符串作为参数发送到服务器端回调事件处理程序。
  • 另一个函数由处理回调事件的服务器代码的结果调用并接收该结果,同时接受表示该结果的字符串。该函数称为客户端回调函数。
  • 第三个函数是执行对服务器的实际请求的 Helper 函数,当在服务器代码中使用 GetCallbackEventReference 方法生成对此函数的引用时,由 ASP.NET 自动生成该函数。

客户端回调及回发都是对起始页的请求,因此在 Web 服务器日志中将客户端回调及回发记录为页请求。

三、回调的过程如下所示:

1)客户端发出请求,请求内容包括:指定更新控件和传递参数。

2)服务端响应、处理。

3)服务端将处理后的内容以字符串返回。

4)客户端使用一个函数接受返回值

5)客户端更新指定控件。

四、实例

01:

<!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 Success(args,context){ 

message.innerHTML=args; 

 

//下面的方式是当接收服务器方法处理的结果发生异常时调用的方法 

function Error(){ 

message.innerHTML="发生了异常!"

</script> 

</head> 

<body> 

<form id="form1" runat="server"

<div> 

用户名:<input type="text" id="txtUserName" onblur="CallServerMethod(txtUserName.value,null)" /> 

<span id="message"></span> 

<br /> 

密码:<input type="password" size="10" maxlength="20" id="txtPwd" /> 

</div> 

</form> 

</body> 

</html>

[code]

public partial class Default3 : System.Web.UI.Page,ICallbackEventHandler //实现ICallbackEventHandler接口 

 

String result = String.Empty; 

 

protected void Page_Load(object sender, EventArgs e) 

//获取当前页的ClientScriptManager的引用 

ClientScriptManager csm = Page.ClientScript; 

/*获取回调的引用.会在客户端生成WebForm_DoCallback方法, 

* 调用它来达到异步调用.这个方法是微软写的方法,会被发送 

到客户端*/

/*注意这里的"Success"和Error两个字符串分别是客户端代码中 

*定义的两个javascript函数*/

//下面的方法最后一个参数的意义:true表示执行异步回调,false标志执行同步回调 

String reference = csm.GetCallbackEventReference(this, "args", "Success", "", "Error", true); 

String callbackScript = "function CallServerMethod(args,context){\n"

reference+";\n }"

//向当前页面注册javascript脚本代码 

csm.RegisterClientScriptBlock(this.GetType(), "CallServerMethod",callbackScript,true); 

 

#region ICallbackEventHandler 成员 

 

/// <summary> 

/// 返回回调方法执行结果的方法 

/// </summary> 

public string GetCallbackResult() 

return result; 

 

/// <summary> 

/// 在服务器端运行回调方法 

/// </summary> 

public void RaiseCallbackEvent(string eventArgument) 

if (eventArgument.ToLower().IndexOf("admin")!=-1) 

result =eventArgument+ "不能作为用户注册."

else

result = eventArgument + "可以注册."

 

#endregion 

}

02:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_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 DoSearch(){ 

var firstName=document.getElementById("TextBox1").value; 

CallServer(firstName,""); 

 

//得到服务器的数据 

function ReceiveServerData(txtUserInfo){ 

Results.innerHTML=txtUserInfo; 

 

//设置每1秒执行一次 

setInterval("DoSearch()",1000); 

</script> 

 

</head> 

<body> 

<form id="form1" runat="server"

<div> 

姓名:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 

<br /> 

<span id="Results" style=" width:500px;"></span> 

</div> 

</form> 

</body> 

</html>

[/code]

.aspx.cs

[code]

using System; 

using System.Collections; 

using System.Configuration; 

using System.Data; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.HtmlControls; 

using System.Web.UI.WebControls; 

using System.Web.UI.WebControls.WebParts; 

using System.Data.SqlClient; 

 

public partial class _Default : System.Web.UI.Page, ICallbackEventHandler 

protected string txtUserInfo; 

 

 

protected void Page_Load(object sender, EventArgs e) 

//获取一个对客户端函数的引用 

string cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context"); 

//动态注册回调函数 

string callbackScript = "function CallServer(arg,context)" + "{" + cbReference + "};"

//引发callbackScript 

Page.ClientScript.RegisterStartupScript(this.GetType(), "CallServer", callbackScript, true); 

 

//引发Callback事件处理 

public void RaiseCallbackEvent(string txtFirstName) 

if (txtFirstName != null

String connString = System.Configuration.ConfigurationManager.ConnectionStrings["sqlserver2008"].ToString(); 

 

SqlConnection conn = new SqlConnection(connString); 

 

conn.Open(); 

 

SqlCommand comm = new SqlCommand("select * from zzx where [name][email protected]", conn); 

 

comm.Parameters.Add("@name", SqlDbType.VarChar).Value = txtFirstName; 

 

SqlDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection); 

if (reader.Read()) 

txtUserInfo = "员工编号:" + reader["id"].ToString() + "<br>"

txtUserInfo += "员工姓名:" + reader["name"].ToString() + "<br>"

txtUserInfo += "地址:" + reader["address"].ToString() + "<br>"

txtUserInfo += "服务器查询时间:" + DateTime.Now.ToString(); 

else

if (string.IsNullOrEmpty(txtFirstName)) 

txtUserInfo = "请输入姓名"

else

txtUserInfo = "查无此人"

 

comm.Dispose(); 

reader.Dispose(); 

conn.Dispose(); 

 

//得到回调的结果,返回给客户端 

public string GetCallbackResult() 

return txtUserInfo; 

 

}

03:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_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 OnCallBack(txtUserInfo,context){ 

Results.innerHTML=txtUserInfo; 

</script> 

 

</head> 

<body> 

<form id="form1" runat="server"

<div> 

姓名:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 

<input id="Button2" type="button" value="button"

onclick="<%=Page.ClientScript.GetCallbackEventReference(this, "document.getElementById(‘TextBox1‘).value", "OnCallBack",null)%>" /> 

<br /> 

<span id="Results" style="pink; width: 500;"></span> 

</div> 

</form> 

</body> 

</html>

.aspx.cs

 

using System; 

using System.Collections; 

using System.Configuration; 

using System.Data; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.HtmlControls; 

using System.Web.UI.WebControls; 

using System.Web.UI.WebControls.WebParts; 

using System.Data.SqlClient; 

using System.Text; 

public partial class _Default : System.Web.UI.Page, ICallbackEventHandler 

protected StringBuilder txtUserInfo; 

 

protected void Page_Load(object sender, EventArgs e) 

 

 

public string GetCallbackResult() 

return txtUserInfo.ToString(); 

 

public void RaiseCallbackEvent(string txtFirstName) 

txtUserInfo = new StringBuilder(); 

String connString = ConfigurationManager.ConnectionStrings["sqlserver2008"].ToString(); 

SqlConnection conn = new SqlConnection(connString); 

conn.Open(); 

SqlCommand comm = new SqlCommand("select * from zzx where [name][email protected]", conn); 

comm.Parameters.Add("@name", SqlDbType.VarChar).Value = txtFirstName; 

SqlDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection); 

if (reader.Read()) 

txtUserInfo.Append("员工编号:" + reader["id"].ToString() + "<br>"); 

txtUserInfo.Append("员工姓名:" + reader["name"].ToString() + "<br>"); 

txtUserInfo.Append("地址:" + reader["address"].ToString() + "<br>"); 

txtUserInfo.Append("查询时间:" + DateTime.Now.ToString()); 

else

if (txtFirstName == string.Empty) 

txtUserInfo.Append("请输入姓名"); 

else

txtUserInfo.Append("查无此人"); 

reader.Dispose(); 

comm.Dispose(); 

conn.Dispose(); 

}

}

时间: 2024-11-10 13:15:29

在 ASP.NET 网页中不经过回发而实现客户端回调的相关文章

ASP.NET 网页中的嵌入式代码块

将代码添加到 ASP.NET 网页中的默认模型要么创建一个代码隐藏类文件(代码隐藏页),要么将页的代码写到具有 runat="server" 特性的 script 块中(单文件页). 编写的代码通常会与页上的控件进行交互. 例如,通过从代码中设置控件的 Text(或其他)属性,可以在页上显示信息. 另一种可能是使用嵌入式代码块将代码直接嵌入到页中. 嵌入式代码块 嵌入式代码块是在呈现页面的过程中执行的服务器代码. 块中的代码可以执行编程语句,并调用当前页类中的函数. 下面的代码示例演示

Asp.net网页中禁止使用剪切、复制、粘贴的方法

工欲善其事,必先利其器 在asp.net开发的网页中,有时候需要禁止用户粘贴复制密码,禁止用户copy文章直接粘贴到文本框中.采取的方法是直接在限制控件的地方写上禁止粘贴文本的代码.但是这样不是很方便,假如一个页面中有5个textbox的控件,这时候必须单独对每一个控件都写上禁止复制.粘贴的代码,导致工作量很大.那下面来看看具体操作. 第一步,新建一个空的webform页面. 第二步,在webform中添加几个textbox控件. 第三步,在body标签中加入 oncut="return fal

【C#】ASP.NET网页中添加单点登录功能

背景 首先,要说明的是,原先需求定义的是,同一个账号只能同时有一个人来登录,如果另外一个登录的话,前一个登陆者就自动被踢掉.本来原先要做成存储到服务器的数据库中,但是后来如果是非正常退出的话 下次就没法登录,这下就上网找资料 改了以后就有了下面的东东了. 登陆页后台 Login.aspx.cs //单点登录判断 Hashtable hOnline = (Hashtable)Application["Online"]; if (hOnline != null) { int i = 0;

ASP.NET 3.5控件和组件开发技术之客户端回发/回调揭密

本文摘录自<纵向切入ASP.NET 3.5控件和组件开发技术>. 对于服务端控件元素,比如ASP.NET的Button标准服务端控件在提交时可以自动把请求发送到服务端处理,这样的控件我们不用自己处理它们的事件回发:但对于呈现不引起回发的HTML元素,如“文本框”(TextBox)或“链接按钮”(LinkButton),而希望由控件启动回发,则可以在ASP.NET中通过依靠客户端脚本的事件结构进行编程来实现这一功能.    完整地处理一个事件则还需要回发和捕捉.捕捉是IPostBackEvent

ASP.NET 网页的重定向和传值

在开发 ASP.NET 网站时,您经常需要从一个网页重定向(导航)到另一个网页,同时希望能够将信息从源页传递到目标页.例如,如果您正在开发一个保险网站,用一个页面来收集基本信息(用户信息.保险产品信息等),用另一个页面用来完成支付过程,而支付页面又需要前一页面的部分信息,这时就需要进行页面重定向和传值. 实现网页之间信息传递的方式有很多种,例如,在页面上添加<a>标签并设置其href属性.运用 windows.location 对象.在后台代码中实现等.这里主要介绍如何在后台代码中实现网页之间

FineUI小技巧(6)自定义页面回发

前言 FineUI中的绝大部分回发事件都是由控件触发了,比如按钮的点击事件,下拉列表的改变事件,表格的排序分页事件.但有时我们可能会要自己触发页面回发,这时就要知道怎么使用 JavaScript 来做了,当然这个过程还是 FineUI 所默认支持的AJAX. 手工调用__doPostBack函数 相信每一位使用ASP.NET WebForms的同学都知道这个著名的函数,因为几乎每个页面的源代码中都能看到他的身影: 1 <script type="text/javascript"&

ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法

ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法 近来正在分析淘宝中商品的信息,效果发生乱码,如: 原因便是中文字符格式发生冲突,ASP.NET MVC 默认采用utf-8,可是淘宝网页采用gbk.正在网上找了一下,最常常的搞定方法便是修改web.config:< system.web> ...... < globalization requestEncoding="gbk" responseEncoding="gbk" culture=&

asp网络编程:用ASP编写下载网页中所有资源的程序

看过一篇关于下载网页中图片的文章,它只能下载以http头的图片,我做了些改进,可以下载网页中的所有连接资源,并按照网页中的目录结构建立本地目录,存放资源. download.asp?url=你要下载的网页 download.asp代码如下: <% Server.ScriptTimeout=9999 function SaveToFile(from,tofile) on error resume next dim geturl,objStream,imgs geturl=trim(from) My

ASP.NET中Literal控件的使用方法(用于向网页中动态添加内容)

原文:https://www.jb51.net/article/82855.htm 可以将 Literal 控件用作网页上其他内容的容器.Literal 控件最常用于向网页中动态添加内容.简单的讲,就是可以把 HTML 代码写到 Literal 控件上,直接呈现出来. 一.常见Literal属性 属性 描述 Text 指定 Literal 控件中显示的文本.在用户的浏览器中,这会显示为 HTML. Mode 指定控件如何处理添入其中的标记. 二.基础用法 前台 LiteralTest.aspx