Viel verspätete Antwort:
Ich habe immer wieder damit gerungen, seit ich anfing, in ASP zu arbeiten. Hier ist das Beste, was ich mir ausgedacht habe:
Konzept: Ich erstelle ein benutzerdefiniertes Steuerelement mit einem Tag. Dann habe ich in die Schaltfläche ein Ereignis onclick eingefügt, das document.location mit JavaScript auf den gewünschten Wert setzt.
Ich habe das Steuerelement ButtonLink aufgerufen, damit ich es leicht bekommen kann, wenn ich mit LinkButton verwechselt werde.
aspx:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="ButtonLink.ascx.vb" Inherits="controls_ButtonLink" %>
<asp:Button runat="server" ID="button"/>
Code dahinter:
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
Vorteile dieses Schemas: Es sieht aus wie eine Kontrolle. Sie schreiben ein einzelnes Tag dafür, <ButtonLink id = "mybutton" navigateurl = "blahblah" />
Die resultierende Schaltfläche ist eine "echte" HTML-Schaltfläche und sieht daher genauso aus wie eine echte Schaltfläche. Sie müssen nicht versuchen, das Aussehen einer Schaltfläche mit CSS zu simulieren, und müssen dann mit verschiedenen Erscheinungsbildern in verschiedenen Browsern kämpfen.
Obwohl die Fähigkeiten begrenzt sind, können Sie sie leicht erweitern, indem Sie weitere Eigenschaften hinzufügen. Es ist wahrscheinlich, dass die meisten Eigenschaften nur an die zugrunde liegende Schaltfläche "übergeben" werden müssen, wie ich es für Text, Aktiviert und CSS-Klasse getan habe.
Wenn jemand eine einfachere, sauberere oder auf andere Weise bessere Lösung hat, würde ich mich freuen, sie zu hören. Das ist ein Schmerz, aber es funktioniert.