最干净的方法是使用从
LinkButton
. 事实上,这似乎符合
the blog post
从你的
earlier question
. 你只需要重写
OnPreRender
lbHello.ClientID
this.ClientID
引用该控件的特定实例。设置此项不应超过10分钟。完成后,您可以在一个页面上使用任意数量的控件,并在应用程序的各个页面中轻松支持它。
当您按照我下面的说明,特别是“创建服务器控件”部分操作时,您可能会发现这篇MSDN文章很有帮助:
Walkthrough: Developing and Using a Custom Web Server Control
. 以下是实现这一目标的分步指南:
-
LinkButtonDefault
(当然,您可以随意更改名称)。
-
重命名
ServerControl1.cs
到
LinkButtonDefault.cs
-
将文件中的命名空间重命名为
CustomControls
-
通过打开
AssemblyInfo.cs
Properties
项目的文件夹)。在文件底部添加此行:
[assembly: TagPrefix("CustomControls", "CC")]
-
添加此代码以覆盖
事件:
代码(注意使用
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}:
使用
链接按钮默认值
而不是
ServerControl1
. 新的服务器控制项目就是这样。我强烈建议您阅读前面提到的MSDN文章,以利用其他功能,例如在需要时向工具箱添加控件。
完成这些步骤后,您应该有一个
类似于以下内容的文件:
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应用程序并添加对
项目。您应该能够从Add引用的
Project
选项卡,因为我建议将上述项目添加到现有解决方案中。如果您想在上面的项目中构建自己的解决方案,那么您可以添加对它的
.dll
使用
Browse
链接按钮默认值
控制。
使用@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>
每个页面上的指令。
如果你遇到困难,有任何问题请告诉我。请仔细阅读以上所有内容,因为这是一篇很长的文章,有很多代码。