服务器端控件的局部刷新,CallBack

服务器端控件的局部刷新,CallBack

(2007-01-13 13:46:37)

转载▼

  分类: 技术资料

发现了.net2.0原来有套CallBack机制,可以轻松实现服务器控件类似AJAX的效果(实现局部刷新),不过真的是服务器端控件用AJAX的话,效果确乎是没ASP.NET AJAX 好
Callback与asp.net ajax的UpdatePanel控件内在实现机制都是Ajax
但采用UpdatePanel控件的页面仍然采用Postback方式与服务器交互,会更新ViewState
Callback采用xmlhttp(GET方式)或是iframe,这个过程根本没有涉及到页面的 ViewState (还是没有解决服务器端控件的ViewState问题,而且只支持asp.net2.0,还有很多缺陷,个人不推荐使用)

http://www.cnblogs.com/teddyma/archive/2005/11/28/286196.html 深度解析Asp.Net2.0中的Callback机制
http://www.cnblogs.com/jailu/archive/2007/06/26/796045.html 体验ASP.NET2.0客户端回调功能(CallBack)
http://msdn2.microsoft.com/zh-cn/library/system.web.ui.icallbackeventhandler(VS.80).aspx  MSDN

●一个完整的回调包含以下几个过程:
 (1)客户端发出callback请求;
 (2)服务器端接收客户端callback请求;GetCallbackEventReference接受
 (3)服务器端处理请求并回发请求给客户端;RaiseCallbackEvent处理,GetCallbackResult返回
 (4)客户端接收服务器的返回结果并更新HTML。

●string Page.ClientScript.GetCallbackEventReference(  //获取一个对客户端函数的引用
    string target, //处理客户端callback的服务器控件的名称(实现ICallbackEventHandler接口)
    string argument, //从JS传递给服务器端RaiseCallbackEvent方法的1个参数
    string clientCallback,//接收服务器处理结果的JS函数名。
    string context,//原封不动的传给指定的返回数据处理的JS函数
    string clientErrorCallback,//服务器端事件处理程序出现错误时接收结果的JS函数
    bool useAsync //true同步;false异步
)

●void Page.ClientScript.RegisterClientScriptBlock (  //向Page对象注册客户端脚本
    Type type, //要注册的客户端脚本的类型
    string key,  //要注册的客户端脚本的名称
    string script, //要注册的客户端脚本内容
    bool addScriptTags //指示是否添加脚本标记的布尔值
)

1。要使用Callback首先要继承ICallbackEventHandler接口:
   public partial class Callback : Page, ICallbackEventHandler
   或:
   <%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
2。实现ICallbackEventHandler接口的两个方法
   string GetCallbackResult() //返回一个string类型(只能是string类型)的数据给客户端脚本
    {
     //////
    }
   void RaiseCallbackEvent(string eventArgument) //含一个string类型的传入参数,可用于接收客户端脚本的参数
    {
    ///////
    return "";
    }

3。处理回调页面的Page类还需负责客户端回调脚本的管理:指明哪个JS函数发送callback请求、哪个JS函数接收数据。
   protected void Page_Load(object sender, EventArgs e)
    {
     if(!IsPostBack)
      {
       string strRefrence = Page.ClientScript.GetCallbackEventReference(this, "arg", "AAA", "context");
      // 这里AAA是callback成功之后,客户端接收结果的JS方法,可以包含两个参数。
      //this表示执行callback的的服务端控件是当前这个Page,当前的Page必须实现ICallbackEventHandler接口
      //arg是传给RaiseCallbackEvent的参数eventArgument的值,可以用自定义格式的字符串。            
      //context参数会被原封不动的传给指定的返回数据处理的JS函数

string strCallBack = "function BBB(arg, context) {" + strRefrence + "};";

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "BBB", strCallBack, true); ////注册JS函数BBB,BBB触发GetCallbackEventReference
        }
    }

这样写更好理解点
<script language="javascript" type="text/javascript">
function BBB(arg, context)
{<%= ClientScript.GetCallbackEventReference(this, "arg", "AAA", "context")%>;}
</script>
●前者把JS函数BBB写在了服务器端然后用RegisterClientScriptBlock注册,客户端调用BBB,BB再调用了GetCallbackEventReference
第2种,BBB直接写在客户端。

4。客户端代码:客户端脚本则比较简单了,只需要实现接收callback结果的JS方法(这里是AAA)就OK了
function AAA(valueRES, context)  //valueRES是服务器端处理后的结果
 {
  document.getElementByIdx(elementId1).innerHTML = valueRES;
  document.getElementByIdx(elementId2).innerHTML = context;
 }

例子:用callback获取服务器端的时间(12和24小时制)
Default.aspx.cs
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 _Default : System.Web.UI.Page, ICallbackEventHandler
{
 protected void Page_Load(object sender, EventArgs e)
  {
   if (!IsPostBack)
    {
     string strRefrence = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveDataFromServer", "context");

string strCallBack = "function CallBackToTheServer(arg, context) {" + strRefrence + "};";

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallBackToTheServer", strCallBack, true); //注册JS函数CallBackToTheServer
        }
    }

private string strTimeFormat;

public string GetCallbackResult()
  {
   if (strTimeFormat != "" && strTimeFormat == "12")
     {return DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss(12小时制)");}
    else
     {return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss(24小时制)");}
  }

public void RaiseCallbackEvent(string eventArgument)
  {
   strTimeFormat = eventArgument;
  }
}


Default.aspx
<%@ Page Language="C#" 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>CallBack</title>
<script language="javascript" type="text/javascript">
function ReceiveDataFromServer(valueReturnFromServer,context)
 {
  document.getElementByIdx("ServerTime").innerHTML = valueReturnFromServer;
  document.getElementByIdx("PIG").innerHTML = context;
 }
   
function GetServerTime(format)
 {CallBackToTheServer(format, "你是猪");} //调用触发GetCallbackEventReference的CallBackToTheServer函数(写在服务器端的JS函数)
</script>
</head>
 <body>
  <form id="form1" runat="server">
   <div>
     <asp:Button ID="btnShow12" runat="server" Text="获取服务器时间(12小时制)"OnClientClick="javascript:GetServerTime(12);return false;" /><br />
     <asp:Button ID="btnShow24" runat="server" Text="获取服务器时间(24小时制)"OnClientClick="javascript:GetServerTime(24);return false;" /><br />
     <br />
     <span id="ServerTime"><%= DateTime.Now.ToString("yyyy-MM-dd HHHH:mm:ss") %></span>不点击则为默认显示
     <span id="PIG"></span>
    </div>
  </form>
 </body>
</html>

时间: 2024-10-08 22:12:06

服务器端控件的局部刷新,CallBack的相关文章

.net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器

1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.WebForm使用母版页进行登录时候的验证 //新建一个页面父类 public abstract class BasePage:Page { protected void Page_Load(object sender, EventArgs e) { //1.身份验证的方法 Session if (Se

ASP.NET服务器端控件和HTML控件的比较 (转)

区别:服务器端控件都会有个runat="Server"属性,这样才能够在后台对其进行修改,也就是在cs代码里面能对其进行修改.例如,当你放个HTML控件时,在CS代码中引用不出控件名,但加上runat="Server" 后在CS代码中就能引用该控件了. 其实ASP.NET 的服务器控件解析后最终返回到前台还是HTML控件.例如当你建个页面并放一个asp:textbox上去,然后运行页面,查看页面源文件就会发现放上的服务器控件变成了HTML的inupt type=&q

ASP.NET服务器端控件(class0617)

ASP.Net服务端基本控件介绍 ASP.Net服务端控件是ASP.Net对HTML的封装,在C#代码中就可以用txt1.Text=‘abc’这种方式来修改input的值,ASP.Net会将服务端控件转成HTML代码输出给浏览器.服务端控件是ASP.Net非常吸引初学者.非常容易上手的东西,也是最被人诟病的东西.物尽其用,服务端控件在内网系统.互联网系统的后台部分等访问频率不高的地方用的还是很适合的. (互联网公司,产品型公司(OA)) 在服务端控件的标签中写的属性如果不是控件内置的属性就会被原

ASP.NET--Web服务器端控件和Html控件

今天学习总结了一些相关概念和知识. 之前无论是做 单机的winform 还是 CS的winform 感觉,不到两年下来感觉还可以,虽然API有很多,但是还是比较熟悉基于WINDOWS消息机制的编程,但是现在网络硬件设施更新之快,BS 开发优势之大,不过需要的技术方面倒是得扩宽许多,JavaScript,CSS,Html都需要了解掌握,除webForm之外,对于现今主流的MVC更是需要学习. 概念: asp.net控件服务端控件  --> 响应服务端事件 HTML控件客户端控件   -- > 

JS获取服务器端控件ID

很多时候我们需要在JS中对服务器端控件进行一些简单处理,但是这个时候没有必要回发到服务器,让服务器去处理,这个时候就又要用到JS了 那么怎么去获取这个服务器端控件呢?我们知道服务器最终返回到用户界面的其实就是一个HTML文件,所有的服务器控件最后都成为了普通意义上的HTML,必须TEXTBOX会成为一个<input type="text"....>这个时候,服务器端同样会给该HTML标签加上一个ID,以前写JS来获取这个ID 的时候常常就是用的这个ID,但是我们却不能总是用

Atitit..组件化事件化的编程模型--(2)---------Web datagridview 服务器端控件的实现原理and总结

Atitit..组件化事件化的编程模型--(2)---------Web datagridview 服务器端控件的实现原理and总结 1. 服务端table控件的几个流程周期 1 1.1. 确认要显示的字段(开始渲染) 1 1.2. 确认要显示的title 1 1.3. 格式化 1 2. Render显示级别 1 2.1. 简单化...grid.toHTML(); 1 2.2. 有些设置(title,field) 1 2.3. 完全的的设置(模板机制) 1 3. 服务器端控件跟模板的分离实现 2

android控件 下拉刷新pulltorefresh

外国人写的下拉刷新控件,我把他下载下来放在网盘,有时候访问不了github 支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.GridView.(Horizontal )ScrollView.Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多.并且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好. 国内网盘地址:http://www.400gb.c

Asp.Net 之 服务器端控件与客户端控件的区别

服务器控件,即Asp.Net的控件,控制这些控件必须经过服务器处理,然后响应用户,代码在服务器端解释执行,生成根据用户的浏览器而定的html元素. 客户端控件,即普通Html控件,使用script控制操作,由客户端浏览器解释执行. 服务器控件需要回发执行,当首次打开页面时,需初始化.由runat属性指示的,runat的值有且仅为一值"server".通过添加runat属性,一般的HTML控件可以被很方便地转换到服务器端运行,下面是一个简单的例子:<input type="

c#服务器端控件confirm

1>服务器端控件删除的数据的时候,可以调用js的confirm防止误操作,但是默认的样式实在是让人难以接受,怎么调用自定义的提示框而且同步回发到服务器端, 服务器端的控件的用linkbutton,代码如下 <asp:LinkButton ID="DeleteButton" runat="server" CommandName="Delete" Text="删除" OnClientClick="return