Como posso usar a tag de botão com o ASP.NET?
Eu gostaria de usar o mais novo<button>
tag em um site ASP.NET que, entre outras coisas, permite texto com estilo CSS e incorporar um gráfico dentro do botão. O controle asp: Button processa como<input type="button">
existe alguma maneira de fazer um controle preexistente renderizar<button>
?
Pelo que eu li, há uma incompatibilidade com o IE postando a marcação do botão em vez do atributo value quando o botão está localizado dentro de um<form>
, mas no ASP.NET ele estará usando o evento onclick para disparar __doPostBack de qualquer maneira, então eu não acho que isso seria um problema.
Há alguma razão pela qual eu não deveria usar isso? Se não, como você iria suportá-lo com asp: Button, ou um novo controle de servidor baseado nele? Eu preferiria não escrever meu próprio controle de servidor se isso puder ser evitado.
No começo o<button runat="server">
solução funcionou, mas imediatamente corri para uma situação onde ele precisa ter uma propriedade CommandName, que o controle HtmlButton não tem. Parece que vou precisar criar um controle herdado do Button, afinal.
O que preciso fazer para substituir o método de renderização e torná-lo renderizado?
ATUALIZAR
A resposta de DanHerbert me fez interessado em encontrar uma solução para isso novamente, então passei mais algum tempo trabalhando nisso.
Primeiro, há uma maneira muito mais fácil de sobrecarregar o TagName:
public ModernButton() : base(HtmlTextWriterTag.Button)
{
}
O problema com a solução de Dan é que o innerhtml da tag é colocado na propriedade value, o que causa um erro de validação no postback. Um problema relacionado é, mesmo se você renderizar a propriedade de valor corretamente, a implementação do IE do braindead<button>
A tag publica o innerhtml em vez do valor. Portanto, qualquer implementação disso precisa substituir o método AddAttributesToRender para renderizar corretamente a propriedade value e também fornecer algum tipo de solução alternativa para o IE, para que não estrague completamente o postback.
O problema do IE pode ser intransponível se você quiser aproveitar as propriedades CommandName / CommandArgument para um controle de ligação de dados. Espero que alguém possa sugerir uma solução alternativa para isso.
Eu fiz progresso na renderização:
Isso é um bom html<button>
com o valor correto, mas não funciona com o sistema ASP.Net PostBack. Eu escrevi um pouco do que eu preciso para fornecer oCommand
evento, mas não dispara.
Ao inspecionar este botão lado-a-lado com um asp: Button regular, eles têm a mesma aparência que as diferenças que eu preciso. Então eu não tenho certeza de como ASP.Net está conectando oCommand
evento neste caso.
Um problema adicional é que os controles de servidor aninhados não são processados (como você pode ver com o atributo ParseChildren (false)). É muito fácil injetar texto html literal no controle durante a renderização, mas como você permite o suporte a controles de servidor aninhados?