摘要
一般在注册客户端指令码都是使用 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 方法可以使用相同方式实现。
在 BasePage 中新增一个 BeeScript 属性,来操作 TBScriptManager 对象。
若你想让开发人员一样可以保有使用 ClientScript 的习惯,但其背后已经是使用 TBScriptManager 对象,那就狠一点直接使用 Shadows 遮蔽掉 ClientScript 属性,让他们完全用不到旧的 ClientScript 属性。
一般在注册客户端指令码都是使用 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 String, ByVal Script As String, Optional 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 String, ByVal Script As String, Optional 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 String, ByVal 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 String, ByVal 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 = False) As 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 = False) As 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 Boolean) As String
84 Return FPage.ClientScript.GetPostBackEventReference(Control, Argument, RegisterForEventValidation)
85 End Function
86
87End Class
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 String, ByVal Script As String, Optional 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 String, ByVal Script As String, Optional 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 String, ByVal 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 String, ByVal 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 = False) As 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 = False) As 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 Boolean) As 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
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
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