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

Я хотел бы использовать более новое

62
задан Mark 17 August 2012 в 11:59
поделиться

6 ответов

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

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

Обновление:

возможно сделать несколько маленьких модификаций к Кнопочному управлению посредством наследования и все еще работать довольно хорошо. Это решение избавляет от необходимости реализовывать Ваши собственные обработчики событий для OnCommand (хотя, если Вы хотите изучить, как сделать это, я могу показать Вам, как это обрабатывается). Это также устраняет проблему представления значения, которое имеет разметку в нем, за исключением IE, вероятно. Я все еще не уверен, как зафиксировать плохую реализацию IE тега Кнопки все же. Это может просто быть действительно техническим ограничением, которое невозможно работать вокруг...

[ParseChildren(false)]
[PersistChildren(true)]
public class ModernButton : Button
{
    protected override string TagName
    {
        get { return "button"; }
    }

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

    // Create a new implementation of the Text property which
    // will be ignored by the parent class, giving us the freedom
    // to use this property as we please.
    public new string Text
    {
        get { return ViewState["NewText"] as string; }
        set { ViewState["NewText"] = HttpUtility.HtmlDecode(value); }
    }

    protected override void OnPreRender(System.EventArgs e)
    {
        base.OnPreRender(e);
        // I wasn't sure what the best way to handle 'Text' would
        // be. Text is treated as another control which gets added
        // to the end of the button's control collection in this 
        //implementation
        LiteralControl lc = new LiteralControl(this.Text);
        Controls.Add(lc);

        // Add a value for base.Text for the parent class
        // If the following line is omitted, the 'value' 
        // attribute will be blank upon rendering
        base.Text = UniqueID;
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        RenderChildren(writer);
    }
}

Для использования этого управления у Вас есть несколько опций. Нужно поместить средства управления непосредственно в разметку ASP.

<uc:ModernButton runat="server" 
        ID="btnLogin" 
        OnClick="btnLogin_Click" 
        Text="Purplemonkeydishwasher">
    <img src="../someUrl/img.gif" alt="img" />
    <asp:Label ID="Label1" runat="server" Text="Login" />
</uc:ModernButton>

можно также добавить средства управления к набору управления кнопки в коде - позади.

// This code probably won't work too well "as is"
// since there is nothing being defined about these
// controls, but you get the idea.
btnLogin.Controls.Add(new Label());
btnLogin.Controls.Add(new Table());

я не знаю, как хорошо комбинация обеих опций работает, поскольку я не протестировал это.

единственный недостаток к этому управлению прямо сейчас - то, что я не думаю, что оно будет помнить Ваши средства управления через PostBacks. Я не протестировал это так, это может уже работать, но я сомневаюсь, что это делает. Необходимо будет добавить некоторый код управления состоянием отображения, чтобы подсредства управления были обработаны через PostBacks, я думаю, однако это, вероятно, не проблема для Вас. Добавление поддержки ViewState не должно быть ужасно трудно сделать, хотя в случае необходимости, который может легко быть добавлен.

29
ответ дан Dan Herbert 24 November 2019 в 16:45
поделиться

Вы могли сделать новое управление, наследовавшееся Кнопке, и переопределить метод рендеринга или использовать .browser файл для переопределения всех Кнопок в сайте, подобном пути CSS, которым Дружественные работы материала для TreeView управляют и т.д.

6
ответ дан Steven Robbins 24 November 2019 в 16:45
поделиться

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

<час> РЕДАКТИРОВАНИЕ: Извините.. это - то, что я получаю для просматривания вопросов в мой обеденный перерыв. Есть ли причины, почему Вы просто не использовали бы < кнопка runat = "сервер" > тег или HtmlButton?
6
ответ дан Wayne 24 November 2019 в 16:45
поделиться

Я пошел бы с LinkButton и разработал бы его с CSS как соответствующий.

2
ответ дан Tsvetomir Tsonev 24 November 2019 в 16:45
поделиться

Я весь день боролся с этим - мой собственный

1
ответ дан 24 November 2019 в 16:45
поделиться

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

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

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

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

43
ответ дан 24 November 2019 в 16:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: