Çok geç cevap:
ASP'de çalışmaya başladığımdan beri bununla güreştim. İşte geldim en iyi:
Konsept: Etiketi olan özel bir denetim oluşturuyorum. Sonra düğmeye JavaScript ile istenen değere document.location ayarlayan bir onclick olayı koymak.
Kontrol ButtonLink'i aradım, böylece LinkButton ile karıştırıldığımda kolayca alabilirim.
aspx:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="ButtonLink.ascx.vb" Inherits="controls_ButtonLink" %>
<asp:Button runat="server" ID="button"/>
arkasındaki kod:
Partial Class controls_ButtonLink
Inherits System.Web.UI.UserControl
Dim _url As String
Dim _confirm As String
Public Property NavigateUrl As String
Get
Return _url
End Get
Set(value As String)
_url = value
BuildJs()
End Set
End Property
Public Property confirm As String
Get
Return _confirm
End Get
Set(value As String)
_confirm = value
BuildJs()
End Set
End Property
Public Property Text As String
Get
Return button.Text
End Get
Set(value As String)
button.Text = value
End Set
End Property
Public Property enabled As Boolean
Get
Return button.Enabled
End Get
Set(value As Boolean)
button.Enabled = value
End Set
End Property
Public Property CssClass As String
Get
Return button.CssClass
End Get
Set(value As String)
button.CssClass = value
End Set
End Property
Sub BuildJs()
' This is a little kludgey in that if the user gives a url and a confirm message, we'll build the onclick string twice.
' But it's not that big a deal.
If String.IsNullOrEmpty(_url) Then
button.OnClientClick = Nothing
ElseIf String.IsNullOrEmpty(_confirm) Then
button.OnClientClick = String.Format("document.location='{0}';return false;", ResolveClientUrl(_url))
Else
button.OnClientClick = String.Format("if (confirm('{0}')) {{document.location='{1}';}} return false;", _confirm, ResolveClientUrl(_url))
End If
End Sub
End Class
Bu şemanın avantajları: Bir kontrole benziyor. Bunun için tek bir etiket yazıyorsunuz, <ButtonLink id = "mybutton" navigateurl = "blahblah" />
Ortaya çıkan düğme "gerçek" bir HTML düğmesidir ve gerçek bir düğmeye benzer. CSS ile bir düğmenin görünümünü simüle etmeye ve ardından farklı tarayıcılarda farklı görünümlerle mücadele etmeye çalışmanız gerekmez.
Yetenekler sınırlı olsa da, daha fazla özellik ekleyerek onu kolayca genişletebilirsiniz. Çoğu özellik, metin, etkin ve cssclass için yaptığım gibi, temel düğmeye sadece "geçmek" zorunda kalacak.
Daha basit, daha temiz veya daha iyi bir çözüm varsa, bunu duymaktan mutluluk duyarım. Bu bir acı, ama işe yarıyor.