65.9K
CodeProject 正在变化。 阅读更多。
Home

ICallback 和基于 JSON 的 JavaScript 序列化

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (3投票s)

2007年12月20日

CPOL

2分钟阅读

viewsIcon

34244

Callback是一种轻量级技术,用于从JavaScript异步调用服务器端方法,无需任何回发以及页面不必要部分的重新加载/渲染和不必要的代码。

引言

在使用ASP.NET时,有时我们需要异步调用服务器端方法,而无需回发,无论是完整页面回发还是部分页面回发。感谢ASP.NET团队提供了ICALLBACK的实现。

ICALLBACK

ICALLBACK是一个轻量级过程。它在内部使用众所周知的XMLHTTP对象来调用服务器端方法,它不会导致页面回发,因此不会导致页面渲染,因此我们在客户端显示输出。我们需要自己生成HTML输出并手动渲染控件。

ICALLBACKEVENTHANDLER

ICALLBACK通过使用ICALLBACKEVENTHANDLER接口在ASP.NET中实现,它有两个方法:其中一个用于从JavaScript(客户端代码)调用,另一个将结果异步返回到JavaScript函数。

我们只需要在服务器端使用服务器端代码执行一些操作并返回结果,但结果可以是任何类的实例或对象,JavaScript代码可能不容易处理,因此我们在这里首选JSON,它代表JavaScript对象表示法。

JSON

JSON是一种轻量级的数据交换格式。ASP.NET也对JSON提供了良好的支持。它正在迅速被采用,因为它轻量级且易于人类和机器阅读。

Callback服务器端代码

让我们首先逐步实现ICALLBACKEVENTHANDLER来异步调用服务器端方法

使用System.Web.UI.ICallbackEventHandler实现服务器端 (C#) 页面/控件类。以下是需要实现的两个方法的定义

RaiseCallbackEvent方法通过JavaScript函数调用

public void RaiseCallbackEvent(string eventArgument) 
{
  //to do code here 
}

GetCallbackResult方法在RaiseCallbackEvent方法的处理完成后自行调用

public string GetCallbackResult() 
{
  return ""; 
}

Page_LoadPage_Init事件中,使用以下语句来注册客户端方法。

CallServer(arg, context),顾名思义,用于调用/引发服务器端方法RaiseCallbackEvent string eventArgument)

ReceiveServerData(arg, context)用于通过GetCallbackResult()arg参数获取结果。

protected void Page_Load(object sender, EventArgs e) 
{ 
	ClientScriptManager scriptMgr = Page.ClientScript; 
	String cbReference = 
	  scriptMgr.GetCallbackEventReference(this, "arg", "ReceiveServerData", ""); 
	String callbackScript = 
	  "function CallServer(arg, context) {" + cbReference + "; }"; 
	cm.RegisterClientScriptBlock(this.GetType(),
	  "CallServer", callbackScript, true); 
}

Callback客户端代码

<script language=javascript type=text/javascript> 
function ReceiveServerData(arg, context) 
{ 
  alert(arg); 
} 
function CallSrv() 
{ 
  CallServer('get customer', ''); 
} 
</script> 
<input type=”button” value=”get customer” onclick=”CallSrv()” />

就是这样。这些是您需要使用ICALLBACK调用服务器端代码并获取结果的步骤。

现在我们将看到一些非常简单的步骤,用于基于JSON的JavaScript序列化,以易于解析的格式将结果返回给JavaScript。

假设我们有以下类,我们需要通过JavaScript序列化将其对象返回给JavaScript函数。

示例类

public class Customer 
{ 
	public string Name; 
	public int Age; 
}

JSON代码

在类级别声明字符串jsonResult,它将用于包含返回的最终结果。

两种方法中的示例代码如下所示

public void RaiseCallbackEvent(string eventArgument) 
{ 
	//populate Customer object to return 
	Customer customer = new Customer(); 
	customer.Name = "Muhammad Adnan"; 
	customer.Age = 24; 
	//javascript serialization of Customer object 
	System.Web.Script.Serialization.JavaScriptSerializer jss; 
	jss = new System.Web.Script.Serialization.JavaScriptSerializer(); 
	//stringbuilder to contain serialized customer object 
	System.Text.StringBuilder sbCustomer = new System.Text.StringBuilder(); 
	jss.Serialize(customer, sbCustomer); 
	jsonResult = sbCustomer.ToString(); 
} 
public string GetCallbackResult() 
{ 
	return jsonResult; 
}

异步输出将在毫秒内可用,且无需回发。

结论

Callback是一种轻量级技术,用于从JavaScript异步调用服务器端方法,无需任何回发以及页面不必要部分的重新加载/渲染和不必要的代码。

JSON是一种轻量级数据交换格式,使服务器端类对象可以被客户端代码轻松解析,以在浏览器上显示输出。

© . All rights reserved.