Я хотел бы использовать новый тег <button>
на веб-сайте ASP.NET, который, среди прочего, позволяет использовать текст в стиле CSS и встраивать графику внутри кнопки. Элемент управления asp: Button отображается как <input type="button">
, есть ли способ сделать существующий визуализацию управления для <button>
?
Из того, что я прочитал, существует несовместимость с IE, размещающая разметку кнопки вместо атрибута value, когда кнопка находится в пределах <form>
, но в ASP.NET она будет использовать событие onclick для запуска __doPostBack во всяком случае, поэтому я не думаю, что это будет проблемой.
Есть ли причины, по которым я не должен использовать это? Если нет, как бы вы могли поддержать его с помощью asp: Button или нового серверного элемента управления на его основе? Я бы предпочел не писать собственный серверный контроль, если этого можно избежать.
Сначала работало решение <button runat="server">
, но я сразу же столкнулся с ситуацией, когда ему нужно иметь свойство CommandName, которого не имеет элемент управления HtmlButton. Похоже, мне понадобится создать элемент управления, унаследованный от Button.
Что мне нужно сделать, чтобы переопределить метод рендеринга и сделать его рендерингом, что я хочу?
UPDATE
Ответ DanHerbert заставил меня задуматься над тем, чтобы найти решение для этого снова, поэтому я потратил еще немного времени на его работу.
Во-первых, гораздо проще перегрузить TagName:
public ModernButton() : base(HtmlTextWriterTag.Button)
{
}
Проблема с решением Dan в нем заключается в том, что innerhtml тега помещается в свойство value, что вызывает ошибку проверки при обратной передаче. Связанная с этим проблема заключается в том, что даже если вы правильно оцениваете свойство value, реализация IE braindead тега <button>
помещает innerhtml вместо значения в любом случае. Таким образом, любая реализация этого требует переопределения метода AddAttributesToRender, чтобы правильно отобразить свойство value, а также обеспечить какой-то обходной путь для IE, чтобы он не полностью испортил обратную передачу.
Проблема IE может быть непреодолимой, если вы хотите использовать свойства CommandName/CommandArgument для управления базой данных. Надеюсь, кто-то может предложить обходное решение для этого.
Я добился прогресса в рендеринге:
Это отображает правильное значение html <button>
с правильным значением, но оно не работает с системой ASP.Net PostBack. Я написал некоторые из того, что мне нужно, чтобы предоставить событие Command
, но оно не срабатывает.
При проверке этой кнопки бок о бок с помощью обычной кнопки asp: они выглядят одинаково, кроме различий, которые мне нужны. Поэтому я не уверен, как ASP.Net подключает событие Command
в этом случае.
Дополнительная проблема заключается в том, что вложенные элементы управления сервером не отображаются (как вы можете видеть с атрибутом ParseChildren (false)). Легко вводить литеральный HTML-текст в элемент управления во время рендеринга, но как вы разрешаете поддержку вложенных элементов управления сервером?