有很多種方法可以處理這個。
我喜歡使用的一個就是編寫JS函數,以便它們不會顯式引用任何元素,而是接收元素(或元素ID)作爲參數。然後在你的(用戶)控件背後的代碼中,構建一小段JS,它只設置OnClientClick或調用jQuery(或其他)來將這些元素綁定在一起。
一個例子應該更清楚:
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());
}
other(page,parent control,...)
<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該做的工作包括只有一次,所有的必要的控制的ID作爲參數傳遞。
當然,最好使用jQuery的on()
函數(或類似的機制,取決於您使用的框架)將函數綁定到使用OnClientClick的事件上,以便標記儘可能不含JS。