これに取り組む方法はたくさんあります。
私が使用したいのは、JS関数を記述して、要素を明示的に参照せずに、要素(または要素ID)をパラメーターとして受け取るようにすることです。次に、(ユーザー)コントロールの背後にあるコードで、OnClientClickを設定するか、jQuery(またはその他)を呼び出して要素をバインドするJSの小さな部分を作成します。
例はそれをより明確にする必要があります:
MyUserControl.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyUserControl.ascx.cs" Inherits="MyUserControl" %>
<div style="border: 1px solid gray; margin: 1em;">
My ID = "<%= ID%>"<br />
<asp:TextBox runat="server" ID="tbx" />
<asp:Button runat="server" ID="btn" Text="Alert!" />
</div>
MyUserControl.ascx.cs
protected void Page_Load(object sender, EventArgs e)
{
var script = string.Format("ShowAlert('{0}'); return false;", tbx.ClientID);
btn.OnClientClick = script;
}
MyUserControl.js
function ShowAlert(textboxId)
{
var textbox = jQuery("#" + textboxId);
alert(textbox.val());
}
他の場所(ページ、親コントロール、...)
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="MyUserControl.js"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
<my:UserControl runat="server" ID="control1" />
<my:UserControl runat="server" ID="control2" />
<my:UserControl runat="server" ID="control3" />
<my:UserControl runat="server" ID="control4" />
<my:UserControl runat="server" ID="control5" />
</div>
</form>
</body>
このようにして、作業を行う実際のJSが1回だけ含まれ、必要なすべてのコントロールIDがパラメーターとして渡されます。
もちろんon()
、マークアップが可能な限りJSから解放されるように、OnClientClickを使用するよりも、jQueryの関数(または使用するフレームワークによっては同様のメカニズム)を使用して関数をイベントにバインドすることをお勧めします。