Как я могу использовать тег кнопки с ASP.NET?

Я хотел бы использовать более новый<button> тег на веб-сайте ASP.NET, который, помимо прочего, позволяет вводить текст в стиле CSS и вставлять графику внутри кнопки. Элемент управления asp: Button отображается как<input type="button">Есть ли способ сделать ранее существующий элемент управления для<button>?

Из того, что я прочитал, есть несовместимость с тем, что IE публикует разметку кнопки вместо атрибута значения, когда кнопка находится внутри<form>, но в ASP.NET он будет использовать событие onclick для запуска __doPostBack в любом случае, поэтому я не думаю, что это будет проблемой.

Есть ли причины, по которым я не должен использовать это? Если нет, как бы вы поддержали его с помощью asp: Button или нового серверного элемента управления на его основе? Я бы предпочел не писать свой собственный серверный элемент управления, если этого можно избежать.

Сначала<button runat="server"> Решение сработало, но я немедленно столкнулся с ситуацией, когда ему нужно иметь свойство CommandName, которого нет у элемента управления HtmlButton. Похоже, мне все-таки понадобится создать элемент управления, унаследованный от Button.

Что мне нужно сделать, чтобы переопределить метод рендеринга и заставить его рендерить то, что я хочу?

ОБНОВИТЬ

Ответ ДанХерберта снова заинтересовал меня в поиске решения, поэтому я потратил еще немного времени на его разработку.

Во-первых, существует гораздо более простой способ перегрузки TagName:

public ModernButton() : base(HtmlTextWriterTag.Button)
{
}

Проблема с решением Дэна в его нынешнем виде заключается в том, что innerhtml тега помещается в свойство value, что вызывает ошибку проверки при обратной передаче. Связанная проблема заключается в том, что даже если вы правильно отобразите свойство value, реализация мозговых мертвецов в IE<button> тег отправляет innerhtml вместо значения в любом случае. Таким образом, любая реализация этого должна переопределить метод AddAttributesToRender, чтобы правильно отобразить свойство value, а также обеспечить некоторый обходной путь для IE, чтобы он не полностью испортил обратную передачу.

Проблема IE может быть непреодолимой, если вы хотите воспользоваться преимуществами свойств CommandName / CommandArgument для элемента управления с привязкой к данным. Надеюсь, кто-то может предложить обходной путь для этого.

Я сделал успехи в рендеринге:

ModernButton.cs

Это делает как правильный HTML<button> с правильным значением, но он не работает с системой ASP.Net PostBack. Я написал кое-что из того, что мне нужноCommand событие, но оно не срабатывает.

При осмотре этой кнопки рядом с обычной кнопкой asp: Button, они выглядят так же, кроме различий, которые мне нужны. Так что я не уверен, как ASP.Net подключаетCommand событие в этом случае.

Дополнительная проблема заключается в том, что вложенные серверные элементы управления не отображаются (как вы можете видеть с атрибутом ParseChildren (false)). Во время рендеринга довольно просто внедрить буквенный HTML-текст в элемент управления, но как разрешить поддержку вложенных серверных элементов управления?

Ответы на вопрос(7)

Ваш ответ на вопрос