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

Я хотел бы использовать более новый <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.

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


обновление

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

во-первых, есть гораздо более простой способ перегрузки Имя тега:

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

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

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

я добился прогресса в визуализации:

ModernButton.cs

это отображается как правильный html <button> С правильным значением, но это не работает с ASP.Net система обратной связи. Я написал, что мне нужно, чтобы обеспечить Command событие, но оно не срабатывает.

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

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

7 ответов


это старый вопрос, но для тех из нас, кому не повезло, все еще приходится поддерживать ASP.NET приложения веб-форм, я прошел через это сам, пытаясь включить загрузочные глифы внутри встроенных кнопок управления.

согласно документации Bootstrap, желаемая разметка выглядит следующим образом:

<button class="btn btn-default">
    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
    Search
</button>

мне нужно было, чтобы эта разметка отображалась серверным элементом управления, поэтому я решил найти параметры.

это будет первый логический шаг, но - как объясняет этот вопрос-кнопка отображает <input> элемент вместо <button>, поэтому добавление внутреннего HTML невозможно.

LinkButton (кредит ответ Цветомира Цонева)

источник

<asp:LinkButton runat="server" ID="uxSearch" CssClass="btn btn-default">
    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
    Search
</asp:LinkButton>

выход

<a id="uxSearch" class="btn btn-default" href="javascript:__doPostBack(&#39;uxSearch&#39;,&#39;&#39;)">
    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
    Search
</a>

плюсы

  • выглядит нормально
  • Command событие; CommandName и CommandArgument свойства

минусы

  • оказывает <a> вместо <button>
  • визуализирует и полагается на навязчивый JavaScript

HtmlButton (кредит ответ Филиппа)

источник

<button runat="server" id="uxSearch" class="btn btn-default">
    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
    Search
</button>

результат

<button onclick="__doPostBack('uxSearch','')" id="uxSearch" class="btn btn-default">
    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
    Search
</button>

плюсы

  • выглядит нормально
  • делает правильный <button> элемент

минусы

  • нет Command событие; нет CommandName или CommandArgument свойства
  • визуализирует и полагается на навязчивый JavaScript для обработки его ServerClick событие

на данный момент ясно, что ни один из встроенных элементов управления не подходит, поэтому следующий логический шаг-попытаться изменить их для достижения желаемой функциональности.

пользовательский контроль (кредит ответ Дэна Герберта)

Примечание: это основано на коде Дэна, поэтому все кредиты идут ему.

using System.Web.UI;
using System.Web.UI.WebControls;

namespace ModernControls
{
    [ParseChildren]
    public class ModernButton : Button
    {
        public new string Text
        {
            get { return (string)ViewState["NewText"] ?? ""; }
            set { ViewState["NewText"] = value; }
        }

        public string Value
        {
            get { return base.Text; }
            set { base.Text = value; }
        }

        protected override HtmlTextWriterTag TagKey
        {
            get { return HtmlTextWriterTag.Button; }
        }

        protected override void AddParsedSubObject(object obj)
        {
            var literal = obj as LiteralControl;
            if (literal == null) return;
            Text = literal.Text;
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write(Text);
        }
    }
}

я разделил класс до минимума и переработал его, чтобы достичь той же функциональности с как можно меньшим количеством кода. Я также добавил пару улучшений. А именно:

  • удалить (кажется ненужным)
  • удалить TagName переопределить (кажется ненужные)
  • удалить HTML декодирование из Text (базовый класс уже обрабатывает это)
  • оставить OnPreRender неповрежденными; переопределить AddParsedSubObject вместо (проще)
  • упростить RenderContents переопределить
  • добавить Value свойство (см. ниже)
  • добавить пространство имен (чтобы включить образец @ Register)
  • добавить using директивы

на Value свойство просто обращается старый Text собственность. Это связано с тем, что элемент управления native Button отображает value атрибут в любом случае (с Text значение). С value является допустимым атрибутом <button> элемент, я решил включить свойство для него.

источник

<%@ Register TagPrefix="mc" Namespace="ModernControls" %>

<mc:ModernButton runat="server" ID="uxSearch" Value="Foo" CssClass="btn btn-default" >
    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
    Search
</mc:ModernButton>

выход

<button type="submit" name="uxSearch" value="Foo" id="uxSearch" class="btn btn-default">
    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
    Search
</button>

плюсы

  • выглядит нормально
  • делает правильный <button> элемент
  • Command событие; CommandName и CommandArgument свойства
  • не визуализирует и не полагается на навязчивый JavaScript

минусы

  • нет (кроме как не является встроенным управлением)

хотя вы говорите ,что использование [button runat= "server"] не является достаточно хорошим решением, важно упомянуть об этом - многие программисты .NET боятся использовать" родные " HTML-теги...

использование:

<button id="btnSubmit" runat="server" class="myButton" 
    onserverclick="btnSubmit_Click">Hello</button>

это обычно работает отлично, и все счастливы в моей команде.


я наткнулся на ваш вопрос ищу то же самое. В итоге я использовал отражатель чтобы выяснить, как ASP.NET Button управления визуализацией. Оказывается, его очень легко изменить.

это действительно просто сводится к переопределение TagName и TagKey свойства Button класса. После того, как вы это сделали, вам просто нужно убедиться, что вы визуализируете содержимое кнопки вручную с момента оригинала


вы можете создать новый элемент управления, наследующий от Button, и переопределить метод рендеринга или использовать a .файл браузера для переопределения всех кнопок на сайте, подобно тому, как CSS дружественный материал работает для элемента управления TreeView и т. д.


можно использовать .UseSubmitBehavior собственность, как описано в эта статья о рендеринге ASP.NET кнопка управления как кнопка.


EDIT: извините.. это то, что я получаю за беглые вопросы во время обеденного перерыва. Есть ли причины, по которым вы не будете использовать тег

Я бы пошел с LinkButton и стиль его с CSS по мере необходимости.


я боролся весь день с этим ... мой заказ <button/> создаваемый элемент управления не работает:

:
<button type="submit" name="ctl02" value="Content" class="btn ">
   <span>Content</span>
</button>

на name атрибут выдает ошибку сервера при использовании IE 6 и IE 7. Все отлично работает в других браузерах (Opera, IE 8, Firefox, Сафари.)

лекарство состоит в том, чтобы взломать это . До сих пор не понял.