Réponse bien tardive:
Je me suis battu avec ça de temps en temps depuis que j'ai commencé à travailler dans ASP. Voici le meilleur que j'ai trouvé:
Concept: je crée un contrôle personnalisé qui a une balise. Ensuite, dans le bouton, j'ai mis un événement onclick qui définit document.location sur la valeur souhaitée avec JavaScript.
J'ai appelé le contrôle ButtonLink, de sorte que je puisse facilement obtenir si confondu avec LinkButton.
aspx:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="ButtonLink.ascx.vb" Inherits="controls_ButtonLink" %>
<asp:Button runat="server" ID="button"/>
code derrière:
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
Avantages de ce schéma: Il ressemble à un contrôle. Vous lui écrivez une seule balise, <ButtonLink id = "mybutton" navigateurl = "blahblah" />
Le bouton résultant est un "vrai" bouton HTML et ressemble donc à un vrai bouton. Vous n'avez pas besoin d'essayer de simuler l'apparence d'un bouton avec CSS, puis de lutter avec différents regards sur différents navigateurs.
Bien que les capacités soient limitées, vous pouvez facilement l'étendre en ajoutant plus de propriétés. Il est probable que la plupart des propriétés devraient simplement "passer" au bouton sous-jacent, comme je l'ai fait pour le texte, enabled et cssclass.
Si quelqu'un a une solution plus simple, plus propre ou meilleure, je serais heureux de l'entendre. C'est une douleur, mais ça marche.