Wie kann ich das Schaltflächentag mit ASP.NET verwenden?
Ich möchte das neuere verwenden<button>
Tag in einer ASP.NET-Website, die unter anderem CSS-gestalteten Text und das Einbetten einer Grafik in die Schaltfläche ermöglicht. Das asp: Button-Steuerelement wird als dargestellt<input type="button">
Gibt es eine Möglichkeit, ein bereits vorhandenes Steuerelement zu rendern<button>
?
Nach dem, was ich gelesen habe, gibt es eine Inkompatibilität mit dem IE, der das Markup der Schaltfläche anstelle des value-Attributs veröffentlicht, wenn sich die Schaltfläche in einem befindet<form>
In ASP.NET wird jedoch das Ereignis onclick verwendet, um __doPostBack auszulösen, sodass ich nicht glaube, dass dies ein Problem wäre.
Gibt es Gründe, warum ich das nicht verwenden sollte? Wenn nicht, wie würden Sie es mit asp: Button oder einem darauf basierenden neuen Serversteuerelement unterstützen? Ich würde es vorziehen, keine eigene Serversteuerung zu schreiben, wenn dies vermieden werden kann.
Zuerst die<button runat="server">
Die Lösung hat funktioniert, aber ich bin sofort auf eine Situation gestoßen, in der eine CommandName-Eigenschaft erforderlich ist, über die das HtmlButton-Steuerelement nicht verfügt. Es sieht so aus, als müsste ich doch ein von Button geerbtes Steuerelement erstellen.
Was muss ich tun, um die Rendermethode zu überschreiben und sie so zu gestalten, wie ich es möchte?
AKTUALISIEREN
Die Antwort von DanHerbert hat mich daran interessiert, eine Lösung für dieses Problem zu finden, und ich habe mehr Zeit darauf verwendet, daran zu arbeiten.
Erstens gibt es einen viel einfacheren Weg, den TagName zu überladen:
public ModernButton() : base(HtmlTextWriterTag.Button)
{
}
Das Problem mit Dans Lösung ist, dass der Innerhtml des Tags in der value-Eigenschaft platziert wird, was beim Postback einen Validierungsfehler verursacht. Ein verwandtes Problem ist, auch wenn Sie die value -Eigenschaft korrekt rendern, die Braindead-Implementierung des IE<button>
tag postet sowieso das innerhtml anstelle des Wertes. Daher muss bei jeder Implementierung die AddAttributesToRender-Methode außer Kraft gesetzt werden, um die value -Eigenschaft korrekt wiederzugeben, und es muss auch eine Art Problemumgehung für den IE bereitgestellt werden, damit das Postback nicht vollständig durcheinander gebracht wird.
Das IE-Problem ist möglicherweise unüberwindbar, wenn Sie die CommandName / CommandArgument-Eigenschaften für ein datengebundenes Steuerelement nutzen möchten. Hoffentlich kann jemand einen Workaround dafür vorschlagen.
Ich habe Fortschritte beim Rendern gemacht:
Dies wird als richtiges HTML gerendert<button>
mit dem richtigen Wert, aber es funktioniert nicht mit dem ASP.Net PostBack-System. Ich habe einiges von dem geschrieben, was ich brauche, um das zu liefernCommand
Ereignis, aber es wird nicht ausgelöst.
Wenn Sie diesen Knopf nebeneinander mit einem normalen asp: -Knopf untersuchen, sehen sie abgesehen von den Unterschieden, die ich benötige, gleich aus. Ich bin mir also nicht sicher, wie ASP.Net das verkabeltCommand
Ereignis in diesem Fall.
Ein weiteres Problem ist, dass verschachtelte Serversteuerelemente nicht gerendert werden (wie Sie mit dem ParseChildren-Attribut (false) sehen können). Es ist ziemlich einfach, während des Renderns wörtlichen HTML-Text in das Steuerelement einzufügen, aber wie lässt sich die Unterstützung für verschachtelte Serversteuerelemente zulassen?