Jak mogę użyć znacznika przycisku w ASP.NET?
Chciałbym użyć nowszego<button>
znacznik na stronie ASP.NET, który między innymi pozwala na tekst w stylu CSS i osadzenie grafiki wewnątrz przycisku. Asp: Przycisk steruje renderowaniem jako<input type="button">
, czy istnieje jakikolwiek sposób na sprawienie, aby istniejąca kontrola była renderowana na<button>
?
Z tego, co przeczytałem, jest niezgodność z IE publikującym znaczniki przycisku zamiast atrybutu wartości, gdy przycisk znajduje się w obrębie<form>
, ale w ASP.NET i tak użyje zdarzenia onclick do wystrzelenia __doPostBack, więc nie sądzę, aby był to problem.
Czy są jakieś powody, dla których nie powinienem tego używać? Jeśli nie, to w jaki sposób można go obsłużyć za pomocą asp: Button lub nowej kontrolki serwera opartej na tym? Wolałbym nie pisać własnej kontroli serwera, jeśli można tego uniknąć.
Na początku<button runat="server">
rozwiązanie zadziałało, ale natychmiast natrafiłem na sytuację, w której musi mieć właściwość CommandName, której nie ma kontrolka HtmlButton. Wygląda na to, że mimo wszystko będę musiał utworzyć kontrolkę odziedziczoną po Button.
Co muszę zrobić, aby przesłonić metodę renderowania i sprawić, że renderuje to, co chcę?
AKTUALIZACJA
Odpowiedź DanHerberta sprawiła, że ponownie zainteresowałem się rozwiązaniem tego problemu, więc poświęciłem mu trochę więcej czasu.
Po pierwsze, istnieje znacznie łatwiejszy sposób przeciążania nazwy zmiennej:
public ModernButton() : base(HtmlTextWriterTag.Button)
{
}
Problem z rozwiązaniem Dana w obecnej postaci polega na umieszczeniu wewnętrznego znacznika tagu we właściwości value, co powoduje błąd sprawdzania poprawności na postbacku. Związany z tym problem polega na tym, że nawet jeśli poprawnie renderujesz właściwość wartości, implementacja<button>
znacznik mimo to wpisuje wewnętrzną część kodu zamiast wartości. Tak więc każda implementacja tego wymaga zastąpienia metody AddAttributesToRender w celu poprawnego renderowania właściwości wartości, a także zapewnienia pewnego obejścia dla IE, aby nie zepsuło to całkowicie postbacku.
Problem IE może być nie do pokonania, jeśli chcesz skorzystać z właściwości CommandName / CommandArgument dla formantu danych. Mam nadzieję, że ktoś może zaproponować obejście tego problemu.
Dokonałem postępu w renderowaniu:
To sprawia, że jest to właściwy HTML<button>
z poprawną wartością, ale nie działa z systemem ASP.Net PostBack. Napisałem kilka rzeczy, które muszę dostarczyćCommand
zdarzenie, ale nie odpala.
Podczas sprawdzania tego przycisku obok zwykłego asp: Button, wyglądają tak samo, jak różnice, których potrzebuję. Więc nie jestem pewien, jak ASP.Net łączyCommand
zdarzenie w tym przypadku.
Dodatkowym problemem jest to, że zagnieżdżone kontrolki serwera nie są renderowane (jak widać z atrybutem ParseChildren (false)). Dość łatwo jest wprowadzić dosłowny tekst HTML do kontrolki podczas renderowania, ale jak zezwolić na obsługę zagnieżdżonych kontrolek serwera?