คำตอบล่าช้ามาก:
ฉันต่อสู้กับสิ่งนี้มาตลอดตั้งแต่ครั้งแรกที่ฉันเริ่มทำงานใน ASP นี่คือสิ่งที่ดีที่สุดที่ฉันเคยได้รับ:
แนวคิด: ฉันสร้างการควบคุมแบบกำหนดเองที่มีแท็ก จากนั้นในปุ่มฉันใส่เหตุการณ์ onclick ที่ตั้งค่า document.location เป็นค่าที่ต้องการด้วย JavaScript
ฉันเรียกปุ่มควบคุม ButtonLink เพื่อที่ฉันจะได้สับสนถ้าอย่างนั้นกับ LinkButton
aspx:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="ButtonLink.ascx.vb" Inherits="controls_ButtonLink" %>
<asp:Button runat="server" ID="button"/>
โค้ดด้านหลัง:
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
ข้อดีของชุดรูปแบบนี้: ดูเหมือนตัวควบคุม คุณเขียนแท็กเดียวสำหรับมัน <ButtonLink id = "mybutton" navigateurl = "blahblah" />
ปุ่มผลลัพธ์เป็นปุ่ม HTML "ของจริง" และดูเหมือนกับปุ่มจริง คุณไม่จำเป็นต้องลองจำลองลักษณะของปุ่มด้วย CSS และต่อสู้กับหน้าตาต่าง ๆ บนเบราว์เซอร์ที่แตกต่าง
ในขณะที่ความสามารถมี จำกัด คุณสามารถขยายได้โดยการเพิ่มคุณสมบัติเพิ่มเติม อาจเป็นไปได้ว่าคุณสมบัติส่วนใหญ่จะต้อง "ส่งผ่าน" ไปยังปุ่มที่สำคัญเช่นฉันทำข้อความเปิดใช้งานและ cssclass
หากใครมีวิธีที่ง่ายกว่าสะอาดกว่าหรือดีกว่าฉันยินดีที่จะรับฟัง นี่คือความเจ็บปวด แต่มันได้ผล