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:

ModernButton.cs

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?

questionAnswers(6)

yourAnswerToTheQuestion