Самый простой способ - использовать пользовательский серверный элемент управления, который наследуется от LinkButton
. На самом деле это похоже на сообщение в блоге из вашего предыдущего вопроса . Все, что вам нужно сделать, это переопределить событие OnPreRender
и вставить код, который вы имеете при изменении lbHello.ClientID
на this.ClientID
, чтобы ссылаться на конкретный экземпляр этого элемента управления. Это не должно занять более 10 минут. После этого вы можете использовать столько элементов управления, сколько хотите, на одной странице и легко поддерживать их на разных страницах вашего приложения.
Эта статья MSDN может оказаться полезной при выполнении следующих моих инструкций, в частности, в разделе «Создание элемента управления сервером»: Пошаговое руководство. Разработка и использование пользовательского элемента управления веб-сервера . Вот пошаговое руководство для достижения этой цели:
- В существующее решение добавьте новый проект ASP.NET Server Control (щелкните правой кнопкой мыши свое решение в обозревателе решений -> Добавить новый проект -> ASP.NET Server Control). Назовите его
LinkButtonDefault
(вы, конечно, можете сменить имя).
- Переименовать
ServerControl1.cs
в LinkButtonDefault.cs
- Переименовать пространство имен в файле в
CustomControls
- Выполните шаги 12-14 в статье MSDN, открыв файл
AssemblyInfo.cs
(содержится в папке Properties
проекта). Добавьте эту строку внизу файла: [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);
}
}
}
Теперь вернитесь в свое веб-приложение и добавьте ссылку на проект 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
для вашего веб-приложения.
- Найдите раздел
<system.web>...</system.web>
.
- Добавьте следующее сопоставление в этот раздел:
Отображение:
<pages>
<controls>
<add assembly="CustomControls" namespace="CustomControls" tagPrefix="CC" />
</controls>
</pages>
Перекомпилируйте и все должно успешно сработать. После этого вам больше не нужно указывать директиву @ Register
на каждой отдельной странице.
Если вы застряли и у вас возникнут вопросы, дайте мне знать. Просто внимательно прочитайте все вышеперечисленное, поскольку это длинный пост с большим количеством кода.