【例3-3】CallBackObject.js
function CallBackObject()
{
this.XmlHttp = this.GetHttpObject();
}
CallBackObject.prototype.GetHttpObject = function()
{
var xmlhttp;
/*@cc_on
@if (@_jscript_version >= 5)
try
{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (E)
{
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end @*/
if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
{
try
{
xmlhttp = new XMLHttpRequest();
}
catch (e)
{
xmlhttp = false;
}
}
return xmlhttp;
}
CallBackObject.prototype.DoCallBack = function(eventTarget, eventArgument)
{
var theData = '';
var theform = document.forms[0];
var thePage = window.location.pathname + window.location.search;
var eName = '';
theData = '__EVENTTARGET=' +
escape(eventTarget.split("$").join(":")) + '&';
theData += '__EVENTARGUMENT=' + eventArgument + '&';
theData += '__VIEWSTATE=' +
escape(theform.__VIEWSTATE.value).replace(new RegExp('\\+', 'g'), '%2b') + '&';
theData += 'IsCallBack=true&';
for (var i=0; i<theform.elements.length; i++)
{
eName = theform.elements[i].name;
if (eName && eName != '')
{
if (eName == '__EVENTTARGET' ||
eName == '__EVENTARGUMENT' ||
eName == '__VIEWSTATE' )
{
// Do Nothing
}
else
{
theData = theData +
escape(eName.split("$").join(":")) + '=' + theform.elements[i].
value;
if( i != theform.elements.length - 1 )
theData = theData + '&';
}
}
}
if (this.XmlHttp)
{
if( this.XmlHttp.readyState == 4 || this.XmlHttp.readyState == 0 )
{
var oThis = this;
this.XmlHttp.open('POST', thePage, true);
this.XmlHttp.onreadystatechange = function(){ oThis.ReadyState
Change(); };
this.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-
form-urlencoded');
this.XmlHttp.send(theData);
}
}
}
CallBackObject.prototype.AbortCallBack = function()
{
if (this.XmlHttp)
this.XmlHttp.abort();
}
CallBackObject.prototype.OnLoading = function()
{
// Loading
}
CallBackObject.prototype.OnLoaded = function()
{
// Loaded
}
CallBackObject.prototype.OnInteractive = function()
{
// Interactive
}
CallBackObject.prototype.OnComplete = function(responseText, responseXml)
{
// Complete
}
CallBackObject.prototype.OnAbort = function()
{
// Abort
}
CallBackObject.prototype.OnError = function(status, statusText)
{
// Error
}
CallBackObject.prototype.ReadyStateChange = function()
{
if (this.XmlHttp.readyState == 1)
{
this.OnLoading();
}
else if (this.XmlHttp.readyState == 2)
{
this.OnLoaded();
}
else if (this.XmlHttp.readyState == 3)
{
this.OnInteractive();
}
else if (this.XmlHttp.readyState == 4)
{
if (this.XmlHttp.status == 0)
this.OnAbort();
else if (this.XmlHttp.status == 200 && this.XmlHttp.statusText == "OK")
this.OnComplete(this.XmlHttp.responseText, this.XmlHttp.responseXML);
else
this.OnError(this.XmlHttp.status, this.XmlHttp.statusText, this.
XmlHttp.responseText);
}
}
2.服务器端部分(CallBackHelper类)
为了处理CallBackObject对象发送到服务器端的请求,需要在服务器端增加一个C#类CallBackHelper,其主要作用是读取HTTP请求并且返回响应。CallBackHelper类的实现比较简单,如例3-4所示。
【例3-4】CallBackHelper.cs
using System;
using System.Web;
namespace ch32
{
/// <summary>
/// CallBackHelper 的摘要说明
/// </summary>
public sealed class CallBackHelper
{
private CallBackHelper() { }
public static bool IsCallBack
{
get
{
HttpRequest hr = CallBackHelper.GetHttpRequest();
return hr.Params["IsCallBack"] != null;
}
}
public static void Write( string Text )
{
HttpResponse hr = CallBackHelper.GetHttpResponse();
hr.Clear();
hr.StatusCode = 200;
hr.StatusDescription = "OK";
hr.Write( Text );
hr.Flush();
hr.End();
}
public static void HandleError( Exception e )
{
HttpResponse hr = CallBackHelper.GetHttpResponse();
hr.Clear();
hr.StatusCode = 200;
hr.StatusDescription = "ERROR";
hr.Write( e.ToString() );
hr.Flush();
hr.End();
}
private static HttpResponse GetHttpResponse()
{
HttpResponse hr = null;
try
{
hr = System.Web.HttpContext.Current.Response;
}
catch( NullReferenceException nre )
{
throw new
Exception("CallBackHelper could not access current HttpResponse
object", nre);
}
return hr;
}
private static HttpRequest GetHttpRequest()
{
HttpRequest hr = null;
try
{
hr = System.Web.HttpContext.Current.Request;
}
catch( NullReferenceException nre )
{
throw new
Exception("CallBackHelper could not access current HttpRequest
object", nre);
}
return hr;
}
}
}







