ScriptManager-EnablePageMethod和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」,因为它省略页面控件加载的动作。

来源:http://www.cnblogs.com/jeff377/archive/2008/08/26/1277034.html

加支付宝好友偷能量挖...


评论(0)网络
阅读(142)喜欢(0)Asp.Net/C#/WCF