ScriptManager EnablePageMethods 与 JSON 序列化

本文通过实例对比了ScriptManagerPageMethods与CallBackPageCommand两种方式在处理客户端与服务器交互过程中的不同。前者简化了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」,因为它省略页面控件加载的动作。

转载于:https://www.cnblogs.com/jeff377/archive/2008/08/26/1277034.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值