ScriptManager EnablePageMethods 與 JSON 序列化
當設定 ScriptManager 控制項的 EnablePageMethods 屬性值為 True 時,我們可以從用戶端指令碼呼叫 ASP.NET 網頁中的公用靜態網頁方法,而且它預設就支援 JSON 序列化。在本文中將使用 ScriptManager 的 PageMethods,重新做一次上篇「CallBack PageCommand 與 JSON 序列化」文章的範例,來比較「CallBack PageCommand」及 「ScriptManager PageMethods」之間的差異。
我們先來複習上篇範例 CallBack PageCommand 的運作流程如下
用戶端物件 -> 1.用戶端 JSON 序列化 -> CallBack 呼叫伺服端 -> 2.伺服服端 JSON 反序列化還原物件 -> 修改物件屬性
-> 3.伺服端 JSON 序列化 -> CallBack 回傳用戶端 -> 4.用戶端 JSON 反序列化還原物件
相同的需求,以 ScriptManager PageMethods 改寫的運作流程式如下
用戶端物件 -> 1.呼叫伺服端的靜態方法-> 修改物件屬性 -> 2.接收伺服端回傳的回呼函式
接下來我們就利用 ScriptManager PageMethods 來實作上述的範例,首先將 ScriptManager 控制項的 EnablePageMethods 屬性值設為 True。
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True" >
在頁面上放置一個 HTMLButton,按鈕 onclick 時執行 CallServer 函式來呼叫伺服端的靜態方法。其中 CallServer 函式中會呼叫 GetUser 產生物件,ASP.NET 機制會自動將此物件利用 JSON 序列化,傳給伺服端的 GetServerUser 靜態方法。當伺服端執行結束,會以 CallServerResult 函式接回伺服端回傳的結果並顯示物件屬性值。
<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>PageMethod</title>
<script type="text/jscript">
function GetUser(){
var oUser={
ID : "007",
Name : "jeff"
};
return oUser;
}
//執行伺服端函式
function CallServer(){
var oUser = GetUser(); //準備傳給伺服端的物件
PageMethods.GetServerUser(oUser, CallServerResult);
}
//回呼函式
function CallServerResult(result){
//顯示 CallBack 後的物件
alert('Server:\n'+'ID:'+result.ID+'\nName:'+result.Name);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
</asp:ScriptManager>
<input type="button" value="執行 PageMethod" onclick="CallServer()" /><br />
</div>
</form>
</body>
</html>
再來撰寫伺服端的 GetServerUser 靜態方法,並以 <System.Web.Services.WebMethod> 標記此方法。GetServerUser 方法的 Value 參數為 TUserData 型別,ASP.NET 機制會自動傳用戶端傳入的字串利用 JSON 反序列化為 TUserData 型別的物件,在此方法中修改物件的屬性值,再回傳給用戶端。
<System.Web.Services.WebMethod()> _
Public Shared Function GetServerUser(ByVal Value As TUserData) As TUserData
'修改用戶端傳入的物件,再傳回用戶端
Value.ID = "012"
Value.Name = "tony"
Return Value
End Function
<Serializable()> _
Public Class TUserData
Dim FID As String = String.Empty
Dim FName As String = String.Empty
Public Property ID() As String
Get
Return FID
End Get
Set(ByVal value As String)
FID = value
End Set
End Property
Public Property Name() As String
Get
Return FName
End Get
Set(ByVal value As String)
FName = value
End Set
End Property
End Class
執行結果如下
結論:「ScriptManager PageMethods」與「CallBack PageCommand」比較
依上述的示範,會不會發覺同樣的需求使用「ScriptManager PageMethods」比「CallBack PageCommand」來處理顯的更簡單了,在「ScriptManager PageMethods」的運作流程中雖然使用了 JSON 序列化,可是在程式碼中完全不需自行處理 JSON 序列化/反序列化的動作。
理論上「ScriptManager PageMethods」應該可完全取代「CallBack PageCommand」,不過事實上並不盡然,正確的說是依使用時機而定。因為「ScriptManager PageMethods」是呼叫伺服端的靜態方法,所以無法存取頁面上的控制項,而「CallBack PageCommand」則可以存取頁面上的控制項;在執行效能上「ScriptManager PageMethods」會優於「CallBack PageCommand」,因為它省略頁面控制項載入的動作。