相对于由无到有开发控件,继承现有现服务器控件是比较简单且实用的方式;若希望在现有的控件增加某些属性或功能,直接继承该控件下来扩展功能是最快的方式,例如「按下 Button 会弹出询问讯息」、「TextBox 设为 ReadOnly 时,可以取得前端传回的 Text 属性」这类需求,都可以直接继承原控件下来,加上我们需要的功能即可。以下我们就以一个简单的案例来说明如何继承现有服务器下来扩展功能。
一、扩展 Button 控件:按钮加上询问讯息
按下按钮执行某些动作前,有时会询问使用者是否执行该动作;例如按下删除钮,会询问使用者是否确定要执行删除的动作。当然这只需要简单的 JavaScript 就可以完成,不过相对于 .NET 的程序语言,JavaScript 是非常不易维护的客户端指令码,如果能让开发人员完全用不到 JavaScript,那何乐不为呢? 那就由 Button 控件本身提供加上询问讯息的功能就可以,相关的 JavaScript 由控件去处理。
一般要在 Button 加上询问讯息,只要在 OnClientClick 属性设定如下的 JavaScript 即可。我们的目的只是让开发人员连设定 OnClientClick 属性的 JavaScript 都省略,直接设定要询问的讯息即可,接下来我们就要开始实作这个控件。
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="if (confirm('確定執行嗎?')==false) {return false;}" />
在 Bee.Web 项目中,加入「ASP.NET 服务器控件」,此控件继承 Button 下来命名为 TBButton (命名空间为 Bee.Web.WebControls)。在 TBButton 类别中加入 ConfirmMessage 属性,用来设定询问讯息的内容。然后在 Render 方法将询问询息的 JavaScript 设定到 OnClientClick 属性即可。
Namespace WebControls
< _
Description("按鈕控制項"), _
ToolboxData("<{0}:TBButton runat=server></{0}:TBButton>") _
> _
Public Class TBButton
Inherits System.Web.UI.WebControls.Button
<Description("詢問訊息")> _
Public Property ConfirmMessage() As String
Get
Dim sConfirmMessage As String
sConfirmMessage = CStr(ViewState("ConfirmMessage"))
If sConfirmMessage Is Nothing Then
Return String.Empty
Else
Return sConfirmMessage
End If
End Get
Set(ByVal value As String)
ViewState("ConfirmMessage") = value
End Set
End Property
''' <summary>
''' 覆寫 Render 方法。
''' </summary>
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
Dim sScript As String
Dim sConfirm As String
'若有設定 ConfirmMessage 屬性,則在 OnClientClick 加入詢問訊息的 JavaScript
If Me.ConfirmMessage <> String.Empty Then
sScript = Me.OnClientClick
'詢問訊息的 JavaScript
sConfirm = String.Format("if (confirm('{0}')==false) {{return false;}}", Me.ConfirmMessage)
If sScript = String.Empty Then
Me.OnClientClick = sConfirm
Else
Me.OnClientClick = sConfirm & sScript
End If
End If
MyBase.Render(writer)
End Sub
End Class
End Namespace
将 TBButton 拖曳到测试页面,设定 ConfirmMessage 属性。
<bee:TBButton ID="TBButton1" runat="server" ConfirmMessage="確定刪除此筆資料嗎?" Text="刪除" />
執行結果如下。
二、结语
笔者在开发 ASP.NET 的应用程序过程中,通常会习惯把所有现有控件继承下来,无论目前需不需要扩展控件功能。这种方式对于开发大型系统是相当有帮助的,因为无法预期在系统开发的过程中会不会因为某些状况,而临时需要扩展控件的功能,所以就先全部继承下来以备不时之需,也为未来保留修改的弹性。
三、相关连结
扩展 CommandField 类别 - 删除提示讯息
按钮加上询问讯息
备注:本文同步发布于「第一届iT邦帮忙铁人赛」,如果你觉得这篇文章对您有帮助,记得连上去推鉴此文增加人气 ^^
http://ithelp.ithome.com.tw/question/10011562