摘要:test
文章来源 http://blog.yam.com/jerrytung/article/3639749
由于PostBack 是透过 Submit 和 Reload,让 Client 端和 Server 端交互,但当控件一多时,一个页面 PostBack 回去,再重新 Reload 回来,会造成画面一闪一闪的,若带宽不足,还会导致动作异常不流畅。
因此想要在不换页的状况下就可以更新 Client 端的网页,可以采用 CallBack 的机制。
首先要让页面支持 CallBack,必须在 Page 实践 System.Web.UI.ICallbackEventHandler 这个 interface,
并且实践此 interface 的两个方法:
string GetCallbackResult ()
void RaiseCallbackEvent (string EventArgument)
CallBack整个流程原理:
Step1.按下 HtmlButton
Step2.执行 CallBack?机制
Step3.CallBack 机制会在 Client 端背景调用 Server 端的 .aspx.cs 程序,此步并不会引发?PostBack(这时 Server 端的‘RaiseCallbackEvent’会接收到 Client 端传入的值[此例为 CallBackButtonArg]。接着,会透过‘GetCallbackResult’将运算过的值回传到 Client 端)
Step4.Server 端处理完之后,会链 Client 端的 JavaScript 函数‘ReceiveServerData’,因此刚才透过‘GetCallbackResult’回传的值,会被‘ReceiveServerData’接收到。
Step5.显示结果,完成 CallBack 机制。
其 中‘ReceiveServerData(arg, context) ’内容的 CallBackButtonArg 为 server 回传的数据(也就是从‘GetCallbackResult’ 返回的字符串数据), 而 context 则是第二个变量, 这个变量是 for client side javascript 自己在完成 callback 时使用的, 也就是在上面看到的 ‘JerryTung‘ 这个部分, 这个变量注意是 client side 的(当然可以从 server side 生成后放入, 但不会在 callback runtime 时改变)。
完整的程序及注解如下:
----------------------------------Default.aspx--------------------------------------
<%@ Page Language="C#" AutoEventWireup="true"? CodeFile="Default.aspx.cs" Inherits="_Default" %>
??
??
===========================================================
----------------------------------Default.aspx.cs----------------------------------
using System;
using System.Data;
using System.Configuration;
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, System.Web.UI.ICallbackEventHandler
{
?? string strCallback;
??? //处理从 Client 端传来的值,其中 eventArgument 为触发事件的参数
?? public void RaiseCallbackEvent(String eventArgument)
?? {
?????? strCallback = eventArgument + " " + DateTime.Now.ToString("hh:mm:ss");
?? }
??? //处理要回传给 Client 端的值
?? public string GetCallbackResult()
?? {
?????? return strCallback;
?? }
??? protected void Page_Load(object sender, EventArgs e)
?? {
?????? //建立一段可以触发 CallBack 的 JavaScript 命令码
?????? string cbReference = Page.ClientScript.GetCallbackEventReference(this, "‘CallBackButtonArg‘", "ReceiveServerData", "‘JerryTung‘");
?????? //将刚才建立好的 CallBack 的 JavaScript 程序,注册到 HtmlButton 的 onclick 事件上
?????? CallBackButton.Attributes["onclick"] = cbReference;
??????? //产生一段 JavaScript 函数,用来接收并处理 CallBack 机制执行后从 Server 端传来的回传值
?????? string strScript = "function ReceiveServerData(arg, context){ document.getElementById(‘" + TextBox1.ClientID + "‘).value = ‘# ‘ + arg + ‘ @ ‘ + context; }";
?????? //在页面上插入 strScript 的 JavaScript 程序
?????? Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myscript", strScript, true);
?? }
}
===========================================================
原文:大专栏 舍弃PostBack,采用CallBack(范例)