Я хотел бы использовать более новый тег <button>
на веб-сайте ASP.NET, который, помимо прочего, позволяет вводить текст в стиле CSS и вставлять графику внутри кнопки. Элемент управления asp: Button отображается как <input type="button">
, есть ли способ сделать ранее существующий элемент управления отображенным в <button>
?
Из того, что я прочитал, есть несовместимость с IE, публикующим разметку кнопки вместо атрибута значения, когда кнопка находится в пределах <form>
, но в ASP.NET она будет использовать событие onclick для запуска __doPostBack во всяком случае, поэтому я не думаю, что это будет проблемой.
Есть ли причины, по которым я не должен использовать это? Если нет, как бы вы поддержали его с помощью asp: Button или нового серверного элемента управления на его основе? Я бы предпочел не писать свой собственный серверный элемент управления, если этого можно избежать.
Сначала решение <button runat="server">
работало, но я сразу же столкнулся с ситуацией, когда ему нужно иметь свойство CommandName, которого нет у элемента управления HtmlButton. Похоже, мне все-таки понадобится создать элемент управления, унаследованный от Button.
Что мне нужно сделать, чтобы переопределить метод рендеринга и заставить его рендерить то, что я хочу?
UPDATE
Ответ ДанХерберта снова заинтересовал меня в поиске решения, поэтому я потратил еще немного времени на его разработку.
Во-первых, есть намного более простой способ перегрузить 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: они выглядят так же, кроме различий, которые мне нужны. Поэтому я не уверен, как ASP.Net подключает событие Command
в этом случае.
Дополнительная проблема заключается в том, что вложенные серверные элементы управления не отображаются (как вы можете видеть по атрибуту ParseChildren (false)). Во время рендеринга довольно просто ввести буквенный HTML-текст в элемент управления, но как разрешить поддержку вложенных серверных элементов управления?