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

ScriptManager EnablePageMethods 与 JSON 序列化相关推荐

  1. C#里XML(JSON)序列化时,自动隐藏值为Null的成员的输出

    原文:C#里XML(JSON)序列化时,自动隐藏值为Null的成员的输出 从StackOverflow里找到的答案.发现对最新的Newtownsoft的JSON序列化也同样适用. https://st ...

  2. .NET 自定义Json序列化时间格式

    .NET 自定义Json序列化时间格式 Intro 和 JAVA 项目组对接,他们的接口返回的数据是一个json字符串,里面的时间有的是Unix时间戳,有的是string类型,有的还是空,默认序列化规 ...

  3. C# Json 序列化与反序列化二

    /// <summary>/// 将对象转换为 JSON 字符串/// </summary>/// <typeparam name="T">&l ...

  4. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  5. 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json

    1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...

  6. xml 和 json 序列化忽略字段

    xml 和 json 序列化忽略字段: @JsonIgnore@XmlTransient 转载于:https://www.cnblogs.com/xiluhua/p/9192577.html

  7. 解决Python自带的json序列化工具不能序列化datetime类型数据问题

    解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...

  8. Logstash为什么那么慢?—— json序列化

    今天跟峡谷金桥聊天,询问起Logstash的性能,金桥提示说Logstash中json的序列化是浪费性能的一方面.于是便有了下面的测试: 第一步,造数据 首先需要造一份数据,数据可以通过logstas ...

  9. JSON序列化和反序列化还有这种玩法

    Mixin对于前端开发者可不陌生,Vue.React等知名前端框架都使用了Mixin.而对于后端开发,尤其是Java后端开发来说Mixin却是一个很陌生的概念.今天来我们通过Jackson让后端开发者 ...

  10. Object of type 'ListSerializer' is not JSON serializable “listserializer”类型的对象不可JSON序列化...

    Object of type 'ListSerializer' is not JSON serializable "listserializer"类型的对象不可JSON序列化 一般 ...

最新文章

  1. 10.1 国庆 考试
  2. 大厂的 404 页面都长啥样?最后一个绝了...
  3. 《C++STL基础及应用》读书笔记
  4. jsp_servlet时序图
  5. 【Python学习系列五】Python网络爬虫框架Scrapy环境搭建
  6. 一款名为Blue_Moon的后台模板的初步研究
  7. leetcode 4 --- 寻找两个有序数组的中位数
  8. python 转成摩尔斯电码_【无线电史话】比莫尔斯电码更直观 | 1919年的护林员通过Myer码传递信息...
  9. 第156天:canvas(三)
  10. 动态网页程序设计报告(留言板)
  11. 大一计算机基础考试知识点,大学计算机基础考试知识点(完整版)
  12. 【Ansys Workbench】—响应面优化操作步骤
  13. numpy 下载安装
  14. 18年12月英语六级第一套听力单词
  15. 深度学习双显卡配置_gpu – 我可以在笔记本电脑上使用intel高清显卡实现深度学习模型...
  16. VTK学习笔记(十一)VTK数据重采样
  17. 企业微信获取corpid,Secret,Agentid
  18. Set_output_delay怎么使用?
  19. 高仿淘宝商品详情标题栏渐变
  20. 高精度18位 5 MSPS 低功耗数据采集信号链_电工基础电路图讲解

热门文章

  1. 删除重复记录10.22
  2. 三层架构(命名规则)
  3. Java做题错误知识点总结(頑張って)!
  4. Tomcat整体架构分析
  5. 调查问卷Html5发展综述
  6. 关于suitescript 无法读取Item Number Field
  7. MYSQL索引和权限管理
  8. javascript复习总结
  9. “SecureCRT遇到一个致命的错误且必须关闭”处理办法
  10. 汉字注音符号学习(引用自维基百科)