Respuesta muy tardía:
He estado luchando con esto de vez en cuando desde que comencé a trabajar en ASP. Aquí está lo mejor que se me ocurrió:
Concepto: creo un control personalizado que tiene una etiqueta. Luego, en el botón, pongo un evento onclick que establece document.location en el valor deseado con JavaScript.
Llamé al control ButtonLink, para que pudiera obtenerlo fácilmente si me confundía con LinkButton.
aspx:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="ButtonLink.ascx.vb" Inherits="controls_ButtonLink" %>
<asp:Button runat="server" ID="button"/>
código detrás:
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
Ventajas de este esquema: parece un control. Usted escribe una sola etiqueta para ello, <ButtonLink id = "mybutton" navigateurl = "blahblah" />
El botón resultante es un botón HTML "real" y se parece a un botón real. No tiene que intentar simular la apariencia de un botón con CSS y luego luchar con diferentes apariencias en diferentes navegadores.
Si bien las habilidades son limitadas, puede ampliarlas fácilmente agregando más propiedades. Es probable que la mayoría de las propiedades solo tengan que "pasar" al botón subyacente, como hice para text, enabled y cssclass.
Si alguien tiene una solución más simple, limpia o mejor, me encantaría escucharla. Esto es un dolor, pero funciona.