这是一个古老的问题,但对于我们这些不幸的人来说,仍然必须保持ASP.NET Web窗体应用程序,我自己也经历了这个过程,同时try 在内置按钮控件中包含 bootstrap 图示符.
根据Bootstrap文档,所需的标记如下:
<button class="btn btn-default">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
Search
</button>
我需要这个标记由服务器控件呈现,所以我开始寻找选项.
Button
这将是合乎逻辑的第一步,但是--正如这个问题所解释的--Button呈现的是<input>
元素而不是<button>
元素,因此不可能添加内部HTML.
Source个个
<asp:LinkButton runat="server" ID="uxSearch" CssClass="btn btn-default">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
Search
</asp:LinkButton>
Output个个
<a id="uxSearch" class="btn btn-default" href="javascript:__doPostBack('uxSearch','')">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
Search
</a>
Pros
- 看起来不错
Command
项;CommandName
和CommandArgument
物业
Cons个
- 渲染
<a>
而不是<button>
- 呈现并依赖于引人注目的JavaScript
Source个个
<button runat="server" id="uxSearch" class="btn btn-default">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
Search
</button>
Result个
<button onclick="__doPostBack('uxSearch','')" id="uxSearch" class="btn btn-default">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
Search
</button>
Pros
Cons个
- 没有
Command
项赛事;没有CommandName
或CommandArgument
处房产
- 呈现并依赖于引人注目的JavaScript to handle its
ServerClick
event
现在很明显,没有一个内置控件看起来是合适的,所以下一个逻辑步骤是try 并修改它们以实现所需的功能.
NOTE: This is based on Dan's code, so all credit goes to him.
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);
}
}
}
我将这个类剥离到了最低限度,并对其进行了重构,以尽可能少的代码实现相同的功能.我还添加了一些改进.即:
- 移除
PersistChildren
属性(似乎没有必要)
- 移除
TagName
超控(似乎没有必要)
- 从
Text
中删除HTML解码(基类已经处理此问题)
- 留下
OnPreRender
个完整的;替代AddParsedSubObject
(更简单)
- 简化
RenderContents
次覆盖
- 添加一个
Value
属性(见下文)
- 添加命名空间(以包括@ Register指令的示例)
- 添加必要的
using
条指令
Value
属性只访问旧的Text
属性.这是因为原生按钮控件无论如何都会呈现value
属性(其值为Text
).因为value
是<button>
元素的有效属性,所以我决定为它包含一个属性.
Source个个
<%@ 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>
Output个个
<button type="submit" name="uxSearch" value="Foo" id="uxSearch" class="btn btn-default">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
Search
</button>
Pros
- 看起来不错
- 渲染一个适当的
<button>
元素
Command
项;CommandName
和CommandArgument
物业
- 不呈现或依赖突兀的JavaScript
Cons个