摘要
一般在注册客户端指令码都是使用 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 方法可以使用相同方式实现。

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

 6Public 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(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(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(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(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(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(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(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(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>

 4Public 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() 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() 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
posted on 2008-05-25 11:07  jeff377  阅读(2602)  评论(4编辑  收藏  举报