最干净的方法是使用继承自LinkButton
. 实际上,这似乎与您之前问题中的博客文章一致。您需要做的就是覆盖事件并粘贴您拥有的代码,同时更改为引用该控件的特定实例。设置它的时间不应超过 10 分钟。完成此操作后,您可以在一个页面上使用任意数量的控件,并在应用程序的各个页面中轻松支持它。OnPreRender
lbHello.ClientID
this.ClientID
遵循我的以下说明,特别是“创建服务器控件”部分:演练:开发和使用自定义 Web 服务器控件时,您可能会发现这篇 MSDN 文章很有帮助。这是完成此操作的分步指南:
- 在您现有的解决方案中添加一个新的 ASP.NET 服务器控件项目(从解决方案资源管理器中右键单击您的解决方案 -> 添加新项目 -> ASP.NET 服务器控件)。命名它
LinkButtonDefault
(当然,您可以随意更改名称)。
- 重命名
ServerControl1.cs
为LinkButtonDefault.cs
- 将文件中的命名空间重命名为
CustomControls
- 通过打开
AssemblyInfo.cs
文件(包含在Properties
项目文件夹中)执行 MSDN 文章中的步骤 12-14。在文件底部添加这一行:[assembly: TagPrefix("CustomControls", "CC")]
- 添加此代码以
LinkButtonDefault.cs
覆盖OnPreRender
事件:
代码(注意使用this.ClientID
):
protected override void OnPreRender(EventArgs e)
{
string addClickFunctionScript = @"function addClickFunction(id) {
var b = document.getElementById(id);
if (b && typeof(b.click) == 'undefined')
b.click = function() {
var result = true;
if (b.onclick) result = b.onclick();
if (typeof(result) == 'undefined' || result)
eval(b.getAttribute('href'));
}
};";
string clickScript = String.Format("addClickFunction('{0}');", this.ClientID);
Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + this.ClientID, clickScript, true);
base.OnPreRender(e);
}
您可能还想更新[ToolboxData("<{0}:
以使用LinkButtonDefault
而不是开头的类声明上方生成的属性代码ServerControl1
。这就是新的服务器控制项目。我强烈建议阅读上述 MSDN 文章以利用其他功能,例如在需要时将控件添加到工具箱。
完成这些步骤后,您应该有一个LinkButtonDefault.cs
类似于以下内容的文件:
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CustomControls
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:LinkButtonDefault runat=server></{0}:LinkButtonDefault>")]
public class LinkButtonDefault : LinkButton
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
}
protected override void OnPreRender(EventArgs e)
{
string addClickFunctionScript = @"function addClickFunction(id) {
var b = document.getElementById(id);
if (b && typeof(b.click) == 'undefined')
b.click = function() {
var result = true;
if (b.onclick) result = b.onclick();
if (typeof(result) == 'undefined' || result)
eval(b.getAttribute('href'));
}
};";
string clickScript = String.Format("addClickFunction('{0}');", this.ClientID);
Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + this.ClientID, clickScript, true);
base.OnPreRender(e);
}
}
}
现在返回到您的 Web 应用程序并添加对CustomControls
项目的引用。您应该可以从“添加引用”Project
选项卡中执行此操作,因为我建议将上述项目添加到您现有的解决方案中。如果您希望您可以在自己的解决方案中构建上述项目,那么您可以.dll
使用Browse
选项卡添加对其文件的引用。添加引用后,您就可以使用新LinkButtonDefault
控件了。
要使用这些控件,您可以在将使用该控件的每个页面上使用 @Register 指令,或者您可以将其添加到 Web.config 并在整个应用程序中轻松引用它。我将在下面向您展示这两种方法。根据您的问题,我认为您需要将其添加到 Web.config 中。请参阅 MSDN 文章,您会在页面中间的“标签前缀”部分下找到此信息。
使用@Register 指令:
转到您想要的.aspx
页面并将Register
指令添加到您要在其中使用控件的每个页面的顶部:
<%@ Register Assembly="CustomControls" Namespace="CustomControls" TagPrefix="CC" %>
在同一页面上,您现在可以使用控件的多个实例。这是一个例子:
<p><strong>1st Panel:</strong></p>
<asp:Label runat="server" ID="helloLabel" />
<asp:Panel ID="Panel1" runat="server" DefaultButton="lbHello">
First name:
<asp:TextBox runat="server" ID="txtFirstName" />
<CC:LinkButtonDefault ID="lbHello" runat="server" Text="Click me" OnClick="lbHello_Click"
OnClientClick="alert('Hello, World!');" />
</asp:Panel>
<p><strong>2nd Panel:</strong></p>
<asp:Label runat="server" ID="fooBarLabel" />
<asp:Panel ID="Panel2" runat="server" DefaultButton="lbFooBar">
Other:
<asp:TextBox runat="server" ID="TextBox1" />
<CC:LinkButtonDefault ID="lbFooBar" runat="server" Text="Click me" OnClick="lbFooBar_Click" />
</asp:Panel>
在 ( .aspx.cs
) 后面的代码中,您需要添加:
protected void Page_Load(object sender, EventArgs e)
{
// example of adding onClick programmatically
lbFooBar.Attributes.Add("onClick", "alert('Foo Bar!');");
}
protected void lbHello_Click(object sender, EventArgs e)
{
helloLabel.Text = String.Format("Hello, {0}", txtFirstName.Text);
}
protected void lbFooBar_Click(object sender, EventArgs e)
{
fooBarLabel.Text = String.Format("FooBar: {0}", TextBox1.Text);
}
使用 Web.config:
要使用 Web.config,请保持与上面示例中使用的完全相同的标记和代码。按着这些次序:
- 删除
@ Register
.aspx 标记上使用的指令。
- 打开
Web.config
您的 Web 应用程序的文件。
- 找到该
<system.web>...</system.web>
部分。
- 将以下映射添加到该部分:
映射:
<pages>
<controls>
<add assembly="CustomControls" namespace="CustomControls" tagPrefix="CC" />
</controls>
</pages>
重新编译,一切都应该成功构建。有了这个,您不再需要@ Register
在每个单独的页面上指定指令。
如果您遇到困难并有任何问题,请告诉我。只需仔细阅读以上所有内容,因为这是一篇包含大量代码的长篇文章。