最もクリーンな方法は、から継承するカスタムサーバーコントロールを使用することLinkButton
です。実際、これは以前の質問のブログ投稿と一致しているようです。あなたがする必要があるのは、イベントをオーバーライドし、そのコントロールの特定のインスタンスを参照するように変更しながら、持っているコードを貼り付けることです。これを設定するのに10分以上かかることはありません。これが完了すると、1つのページで必要な数のコントロールを使用して、アプリケーションのさまざまなページ全体で簡単にサポートできるようになります。OnPreRender
lbHello.ClientID
this.ClientID
このMSDNの記事は、以下の手順、特に「サーバーコントロールの作成」セクション:ウォークスルー:カスタムWebサーバーコントロールの開発と使用に役立つ場合があります。これを実現するためのステップバイステップガイドは次のとおりです。
- 既存のソリューションで、新しいASP.NET Server Controlプロジェクトを追加します([ソリューションエクスプローラー]->[新しいプロジェクトの追加]->[ASP.NET Server Control]からソリューションを右クリックします)。名前を付け
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}:
useで始まるクラス宣言の上に生成された属性コードを更新することもできます。新しいサーバー制御プロジェクトは以上です。前述のMSDNの記事を読んで、必要に応じてツールボックスにコントロールを追加するなど、他の機能を利用することを強くお勧めします。LinkButtonDefault
ServerControl1
これらの手順を完了すると、次のような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
これにより、個々のページでディレクティブを指定する必要がなくなります。
行き詰まって質問があれば、私に知らせてください。たくさんのコードを含む長い投稿なので、上記のすべてを注意深く読んでください。