有很多方法可以解决这个问题。
我喜欢使用的一种是编写 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());
}
其他地方(页面,父控件,...)
<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。