撰写自用的 ScriptManager 来管理客户端指令码 |
| 8/1/2008 5:11:07 PM |
摘要
一般在注册客户端指令码都是使用 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 TBScriptManagerClass 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 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()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()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()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()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()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()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
87 End Class
在 BasePage 中新增一个 BeeScript 属性,来操作 TBScriptManager 对象。
1 /**/''' <summary>
2 ''' 页面基础类别。
3 ''' </summary>
4 Public Class TBBasePageClass 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
21 End 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 |
|
| 作者:jeff377
来源:博客园 |