Как я могу использовать тег 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('uxSearch','')">
<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: извините.. это то, что я получаю за беглые вопросы во время обеденного перерыва. Есть ли причины, по которым вы не будете использовать тег
я боролся весь день с этим ... мой заказ <button/>
создаваемый элемент управления не работает:
:<button type="submit" name="ctl02" value="Content" class="btn "> <span>Content</span> </button>
на
name
атрибут выдает ошибку сервера при использовании IE 6 и IE 7. Все отлично работает в других браузерах (Opera, IE 8, Firefox, Сафари.)лекарство состоит в том, чтобы взломать это . До сих пор не понял.