ScriptManager EnablePageMethods 與 JSON 序列化

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

執行結果如下

image

 

結論:「ScriptManager PageMethods」與「CallBack PageCommand」比較

依上述的示範,會不會發覺同樣的需求使用「ScriptManager PageMethods」比「CallBack PageCommand」來處理顯的更簡單了,在「ScriptManager PageMethods」的運作流程中雖然使用了 JSON 序列化,可是在程式碼中完全不需自行處理 JSON 序列化/反序列化的動作。

理論上「ScriptManager PageMethods」應該可完全取代「CallBack PageCommand」,不過事實上並不盡然,正確的說是依使用時機而定。因為「ScriptManager PageMethods」是呼叫伺服端的靜態方法,所以無法存取頁面上的控制項,而「CallBack PageCommand」則可以存取頁面上的控制項;在執行效能上「ScriptManager PageMethods」會優於「CallBack PageCommand」,因為它省略頁面控制項載入的動作。

ASP.NET 魔法學院