Resposta muito tardia:
Eu tenho lutado com isso desde que comecei a trabalhar no ASP. Aqui está o melhor que eu criei:
Conceito: eu crio um controle personalizado que possui uma tag. Em seguida, no botão, coloquei um evento onclick que define document.location para o valor desejado com JavaScript.
Liguei para o controle ButtonLink, para que eu pudesse facilmente me confundir com o LinkButton.
aspx:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="ButtonLink.ascx.vb" Inherits="controls_ButtonLink" %>
<asp:Button runat="server" ID="button"/>
Código por trá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
Vantagens deste esquema: Parece um controle. Você escreve uma única tag para ele, <ButtonLink id = "mybutton" navigateurl = "blahblah" />
O botão resultante é um botão HTML "real" e, portanto, se parece com um botão real. Você não precisa tentar simular a aparência de um botão com CSS e, em seguida, enfrentar diferentes visões em diferentes navegadores.
Embora as habilidades sejam limitadas, você pode estendê-lo facilmente adicionando mais propriedades. É provável que a maioria das propriedades apenas precise "passar" para o botão subjacente, como eu fiz para o texto, enabled e cssclass.
Se alguém tiver uma solução mais simples, mais limpa ou melhor, ficaria feliz em ouvi-la. Isso é uma dor, mas funciona.