撰写自用的 ScriptManager 来管理客户端指令码

摘要
一般在注册客户端指令码都是使用 Page.ClientScript 属性,不过当 ASP.NET AJAX 出来后,有使用 UpdatePanel 时就需要改用 ScriptManager 来取代部分注册客户端指令码的动作。不过这样有时要使用 ClientScript,有时要使用 ScriptManager 来管理客户端指令码,感觉有点麻烦。而且不知那天又会有 ASP.NET AJAX 2 跑出来,是否又会有新的 ScriptManager2,到时是不是又要改写部分注册客户端指令码的程序代码呢?

撰写自用的 ScriptManager
当有使用 ASP.NET AJAX 时,一定要使用 ScriptManager 来注册客户端指令码;可是又不能完全不用 ClientScript,因为有些方法(例如 GetPostBackEventReference 方法) 在 ScriptManager 并不提供。
所以我们要撰写自用的 ScriptManager 来统一管理客户端指令码的所有方法,我们将撰写 TBScriptManager 类别,整合原来 ClientScript 及 ScriptManager 所提供的方法,然后 BasePage 新增一个 BeeScript 属性来操作 TBScriptManager 对象。


首先我们要新增 TBScriptManager 类别,建构函式需传入 Page 对象,其中会包含 ScriptManager 有提供的方法,例如 RegisterStartupScript、RegisterClientScriptBlock ... 等方法,也会包含 ClientScript 有提供的方法,例如 GetPostBackEventReference、GetPostBackClientHyperlink ... 等方法。这里只例举出部分的方法,其它 ScriptManager 及 ClientScript 方法可以使用相同方式实现。

 1 Imports  System.Web.UI
 2
 3 /**/ ''' <summary>
 4''' 客户端指令码管理。
 5''' </summary>

 6 Public   Class TBScriptManager Class TBScriptManager
 7    Private FPage As System.Web.UI.Page
 8
 9    /**/''' <summary>
10    ''' 建构函式。
11    ''' </summary>
12    ''' <param name="Page">Page 物件。</param>

13    Sub New()Sub New(ByVal Page As System.Web.UI.Page)
14        FPage = Page
15    End Sub

16
17    /**/''' <summary>
18    ''' 注册启始客户端指令码。
19    ''' </summary>
20    ''' <param name="Key">索引键。</param>
21    ''' <param name="Script">客户端指令码。</param>
22    ''' <param name="AddScriptTags">表示是否加入指令码标记。</param>

23    Public Sub RegisterStartupScript()Sub RegisterStartupScript(ByVal Key As StringByVal Script As StringOptional ByVal AddScriptTags As Boolean = True)
24        ScriptManager.RegisterStartupScript(FPage, FPage.GetType(), Key, Script, AddScriptTags)
25    End Sub

26
27    /**/''' <summary>
28    ''' 注册客户端指令码。
29    ''' </summary>
30    ''' <param name="Key">索引键。</param>
31    ''' <param name="Script">客户端指令码。</param>
32    ''' <param name="AddScriptTags">表示是否加入指令码标记。</param>

33    Public Sub RegisterClientScriptBlock()Sub RegisterClientScriptBlock(ByVal Key As StringByVal Script As StringOptional ByVal AddScriptTags As Boolean = True)
34        ScriptManager.RegisterClientScriptBlock(FPage, FPage.GetType, Key, Script, AddScriptTags)
35    End Sub

36
37    /**/''' <summary>
38    ''' 注册页面 OnSubmit 的客户端指令码。
39    ''' </summary>
40    ''' <param name="Key">索引键。</param>
41    ''' <param name="Script">客户端指令码。</param>

42    Public Sub RegisterOnSubmitStatement()Sub RegisterOnSubmitStatement(ByVal Key As StringByVal Script As String)
43        ScriptManager.RegisterOnSubmitStatement(FPage, FPage.GetType, Key, Script)
44    End Sub

45
46    /**/''' <summary>
47    ''' 注册客户端指令码 Include。
48    ''' </summary>
49    ''' <param name="Key">索引键。</param>
50    ''' <param name="Url">客户端指令码 Include URL。</param>

51    Public Sub RegisterClientScriptInclude()Sub RegisterClientScriptInclude(ByVal Key As StringByVal Url As String)
52        ScriptManager.RegisterClientScriptInclude(FPage, FPage.GetType, Key, Url)
53    End Sub

54
55    /**/''' <summary>
56    ''' 取得引发 PostBack 的客户端指令码(其开头附加了 javascript:)。 
57    ''' </summary>
58    ''' <param name="Control">控件。</param>
59    ''' <param name="Argument">参数。</param>
60    ''' <param name="RegisterForEventValidation">事件是否进行验证。</param>

61    Public Function GetPostBackClientHyperlink()Function GetPostBackClientHyperlink(ByVal Control As Control, ByVal Argument As String, _
62        Optional ByVal RegisterForEventValidation As Boolean = FalseAs String
63        Return FPage.ClientScript.GetPostBackClientHyperlink(Control, Argument, RegisterForEventValidation)
64    End Function

65
66    /**/''' <summary>
67    ''' 取得引发 PostBack 的客户端指令码。
68    ''' </summary>
69    ''' <param name="Options">定义回传的 PostBackOptions。</param>
70    ''' <param name="RegisterForEventValidation">事件是否进行验证。</param>

71    Public Function GetPostBackEventReference()Function GetPostBackEventReference(ByVal Options As PostBackOptions, _
72        Optional ByVal RegisterForEventValidation As Boolean = FalseAs String
73        Return FPage.ClientScript.GetPostBackEventReference(Options, RegisterForEventValidation)
74    End Function

75
76    /**/''' <summary>
77    ''' 取得引发 PostBack 的客户端指令码。
78    ''' </summary>
79    ''' <param name="Control">控件。</param>
80    ''' <param name="Argument">参数。</param>
81    ''' <param name="RegisterForEventValidation">事件是否进行验证。</param>

82    Public Function GetPostBackEventReference()Function GetPostBackEventReference(ByVal Control As Control, ByVal Argument As String, _
83        ByVal RegisterForEventValidation As BooleanAs String
84        Return FPage.ClientScript.GetPostBackEventReference(Control, Argument, RegisterForEventValidation)
85    End Function

86
87End Class

在 BasePage 中新增一个 BeeScript 属性,来操作 TBScriptManager 对象。

 1 /**/ ''' <summary>
 2''' 页面基础类别。
 3''' </summary>

 4 Public   Class TBBasePage Class TBBasePage
 5    Inherits System.Web.UI.Page
 6
 7    Private FBeeScrit As TBScriptManager = Nothing
 8
 9    /**/''' <summary>
10    ''' 客户端指令码管理。
11    ''' </summary>

12    Public ReadOnly Property BeeScript()Property BeeScript() As TBScriptManager
13        Get
14            If FBeeScrit Is Nothing Then
15                FBeeScrit = New TBScriptManager(Me)
16            End If
17            Return FBeeScrit
18        End Get
19    End Property

20
21End Class

若你想让开发人员一样可以保有使用 ClientScript 的习惯,但其背后已经是使用 TBScriptManager 对象,那就狠一点直接使用 Shadows 遮蔽掉 ClientScript 属性,让他们完全用不到旧的 ClientScript 属性。

1      Public   Shadows   ReadOnly   Property ClientScript() Property ClientScript() As TBScriptManager
2        Get
3            If FBeeScrit Is Nothing Then
4                FBeeScrit = New TBScriptManager(Me)
5            End If
6            Return FBeeScrit
7        End Get
8    End Property
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值