AspNet 自帶的客戶端回調
AspNet 已經發布有了許多新特性客戶端回調就是其中之一客戶端回調允許我們不經過回發而調用服務器端的方法與AJAX提供的功能是一致的但是不如AJAX靈活AJAX可以自定義調用的方法自帶的回調功能卻不行要使用客戶端回調功能必須實現 SystemWebUIIcallbackEventHandler接口
這個接口包含兩個方法
//客戶端回調時固定調用此方法
public void RaiseCallbackEvent(String eventArgument)
//執行完RaiseCallbackEvent後將調用此方法此方法的返回值將被發回客戶端
public string GetCallbackResult()
例
cs
String cbReference = PageClientScriptGetCallbackEventReference(
thisarg ReceiveServerData context);
String callbackScript;
callbackScript = function CallServer(arg context) + { + cbReference + } ;;
PageClientScriptRegisterClientScriptBlock(
thisGetType()CallServer callbackScript true);
javascript
AJAX介紹
AJAX並不是一種新的技術而是一些已有技術的有機結合主要包括XmlHttpReflect一個AJAX框架基本上包括一個自定義的HttpHandler一段JavaScript代碼
AJAX運行機制
以前我們使用XmlHttp實現無刷新頁面的時候是用XmlHttp來請求一個隱藏的頁面使用(Asp/AspNet)自帶的 HttpHandler而在AJAX中我們請求的也是一個隱藏的頁面不同的是這個頁面的HttpHandler是由我們自己來實現
打造自己的AJAX
首先我們要實現一個Http處理程序(HttpHandler)來響應客戶端的請求
實現自定義的HttpHandler需要實現IHttpHandler接口
該接口包含一個屬性和一個方法
bool IHttpHandlerIsReusable
void IHttpHandlerProcessRequest(HttpContext context)
Example:
bool IHttpHandlerIsReusable
{
get { return true; }
}
void IHttpHandlerProcessRequest(HttpContext context)
{
contextResponseClear(); //獲取要調用的方法
string methodName = contextRequestQueryString[me];
//獲取程序集信息
//CzhenqAJAXClassDencode是自定義的字符串編碼方法
string AssemblyName = CzhenqAJAXClassDencode(contextRequestQueryString[as]);
//獲取方法的參數
string Arguments = contextRequestQueryString[ar]; //開始調用方法
Type type = TypeGetType(AssemblyName);
MethodInfo method = typeGetMethod(methodName
BindingFlagsNonPublic | BindingFlagsPublic | BindingFlagsStatic | BindingFlagsInstance);
if (method != null)
{
//參數使用分隔
string[] args = ArgumentsSplit(ToCharArray());
ParameterInfo[] paras = methodGetParameters();
object[] argument = new object[parasLength];
for (int i = ; i < argumentLength; i++)
{
if (i < argsLength) {
//因為XmlHttp傳遞過來的參數全部時String類型所以必須進行轉換
//這裡只將參數轉換為Int並不做其他考慮
argument[i] = ConvertToInt(args[i]);
}
}
object value = methodInvoke(ActivatorCreateInstance(type true) argument);
if (value != null) contextResponseWrite(valueToString());
else contextResponseWrite(error);
}
//處理結束
contextResponseEnd();
客戶端Javascript代碼
function CallMethod(AssemblyNameMethodNameArgus)
{
var args = ;
for(var i=;i
args += Argus[i] + ;
if(argslength>) args = argssubstr(argslength);
var xmlhttp = new ActiveXObject(MicrosoftXMLHTTP);
url = AJAX/AJAXczhenq?as= + AssemblyName + &me= + MethodName +&ar=+ args;
xmlhttpopen(POSTurlfalse);
xmlhttpsend();
alert(xmlhttpresponseText);
}
一個簡單的AJAX框架已經實現現在寫段代碼來測試
使用自己的AJAX
新建一個網站並應用剛才你編寫的HttpHandler並在網站的nfig中注冊你的HttpHandler說明那些請求將使用你編寫的Handler來處理下面的內容說明:所有以czq結尾的請求都將使用CzhenqHttpHandlerFactory 來處理
type=CzhenqHttpHandlerFactory CzhenqAJAX/>
添加一個web頁面將剛才的腳本拷貝到頁面中並添加一個你要調用的方法
private string Add(int i int j)
{
return TextBoxText;
}
在頁面中放置一個HiddenField控件命名為AssemblyName 並在Page_Load中添加如下代碼
string assemblyName = CzhenqAJAXClassEncode(
typeof(_Default)AssemblyQualifiedName);
AssemblyNameValue = assemblyName;
var assemblyName = documentgetElementById(AssemblyName);
var argus = new Array();
arguspush();
arguspush();
CallMethod(assemblyNameAddargus)
總結 AJAX並不是一種新的技術它只是一些已有技術的有機結合我們可以將AJAX簡單的理解為AjAx是對JavaScript調用XmlHttp的封裝它改變的是代碼書寫方式
附 Encode 與 Dencode實現
public static string Encode(string value)
{
byte[] bytes = ASCIIEncodingASCIIGetBytes(value);
return ConvertToBaseString(bytes);
}
public static string Dencode(string value)
{
byte[] bytes = ConvertFromBaseString(value);
return ASCIIEncodingASCIIGetString(bytes);
}
From:http://tw.wingwit.com/Article/program/net/201311/12064.html