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

Это старый вопрос, но для asp.net-website тех из нас, кому не повезло, которым webpage все еще приходится поддерживать aspx приложения веб-форм ASP.NET, я c#.net сам прошел через это, пытаясь div включить глифы Bootstrap c# во встроенные элементы управления c#-language кнопками.

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


Мне aspdotnet нужно, чтобы эта разметка aspx отображалась серверным элементом c# управления, поэтому я решил asp.net-website найти параметры.

Кнопка

Это будет html-tag первый логический шаг, но .cs-file - как объясняется в этом div вопросе - Button отображает c#-language элемент вместо

Результат


Плюсы

  • Выглядит нормально
  • Отображает правильный элемент

Минусы

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

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

Пользовательский элемент управления (предоставлено Dan Herbert's answer)

ПРИМЕЧАНИЕ. Это основано на коде Дэна, поэтому вся заслуга принадлежит ему.

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);
        }
    }
}

Я .cs-file сократил класс до минимума html и переработал его, чтобы div добиться той же функциональности html-tag с минимальным количеством webpage кода. Я также добавил пару c#.net улучшений. А именно:

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

Свойство htmlbutton Value просто обращается к старому asp-net свойству Text. Это связано с divs тем, что собственный элемент c#.net управления Button в любом aspdotnet случае отображает атрибут visual-c# valueText в качестве его значения). Поскольку divs value является допустимым атрибутом div элемента

Плюсы

  • Выглядит нормально
  • Отображает правильный элемент
  • Command событие; Свойства CommandName и CommandArgument
  • Не обрабатывает навязчивый JavaScript и не полагается на него.

Минусы

  • Нет (кроме того, что он не является встроенным элементом управления)

c#

asp.net

html

htmlbutton

2022-08-19T13:54:18+00:00