
ASP.NET用户控件(UserControl)中直接使用$("#txtP_PERM_ID")等静态ID选择器会导致jQuery失效,因ASP.NET会自动重命名服务器控件ID;需改用动态获取真实客户端ID。
asp.net用户控件(usercontrol)中直接使用`$("#txtp_perm_id")`等静态id选择器会导致jquery失效,因asp.net会自动重命名服务器控件id;需改用``动态获取真实客户端id。
在ASP.NET Web Forms中,当将服务器控件(如<textbox id="txtP_PERM_ID" runat="server"></textbox>)嵌入用户控件(.ascx)时,ASP.NET会在页面渲染阶段自动为该控件生成唯一的、层级化的客户端ID(例如 UC_ProjectsDashboard1_txtP_PERM_ID),以避免ID冲突。这导致前端JavaScript或jQuery中硬编码的 $("#txtP_PERM_ID") 无法匹配实际DOM元素——浏览器控制台通常会报错 Uncaught TypeError: Cannot read property 'val' of null 或静默失败,进而使依赖该元素的逻辑(如 GET_ITO_PROJECTS_DASHBOARD())完全不执行。
✅ 正确做法:在用户控件的 <script></script> 块中,使用服务器端表达式 动态注入真实ID:
<script>
$(function () {
// ✅ 正确:通过 ClientID 获取运行时生成的真实ID
var permIdVal = $("#<%= txtP_PERM_ID.ClientID %>").val();
if (permIdVal === "2059") {
GET_ITO_PROJECTS_DASHBOARD();
}
});
</script>⚠️ 注意事项:
jQuery 1.12.4是jQuery 1.x系列的最后一个正式稳定版本,由jQuery团队于2016年发布。该版本主要面向需要兼容旧版浏览器环境的网站和Web应用,尤其适用于仍需支持Internet Explorer 6、Internet Explorer 7、Internet Explorer 8等老旧浏览器的项目。
- 确保
txtP_PERM_ID控件真实存在于当前用户控件内(即.ascx文件中),且runat="server"属性已设置; - 若该控件位于母版页(Master Page)或上级容器中,需通过
FindControl或提升作用域方式获取引用,再调用.ClientID; - 脚本必须置于控件HTML之后,或包裹在
$(document).ready()(即$(function(){}))中,确保DOM已加载; - 避免在用户控件中重复引入jQuery库(如
<script src="jquery.js"></script>),应统一在母版页或中引入一次; - 若使用ASP.NET AJAX UpdatePanel,需将脚本注册到
ScriptManager.RegisterStartupScript中,否则异步回发后脚本不会重执行。
? 补充建议:为提升可维护性,可将初始化逻辑封装为独立函数,并在页面加载完成后显式调用:
<script>
function initProjectsDashboard() {
const $permInput = $("#<%= txtP_PERM_ID.ClientID %>");
if ($permInput.length && $permInput.val() === "2059") {
GET_ITO_PROJECTS_DASHBOARD();
}
}
$(document).ready(function() {
initProjectsDashboard();
});
</script>总结:ASP.NET用户控件中JS失效的根本原因不是“脚本未加载”,而是ID绑定失配。牢记“服务端ID ≠ 客户端ID”,始终通过 .ClientID 获取真实标识符,即可彻底解决jQuery选择器失效问题。

















