ASP.Net从何处获取其呈现ID?

ASP.Net从何处获取其呈现ID?,asp.net,javascript,rendering,Asp.net,Javascript,Rendering,我继承了一个项目,其中包含一些糟糕的JavaScript,这些JavaScript依赖于硬编码的对象ID。 i、 很多地方都有类似的事情 var magazine = document.getElementById('repModuleDisplay__ctl3_chkCats_0'); 当页面在我的UAT环境中呈现时,HTML看起来是这样的,一切正常 <input id="repModuleDisplay__ctl3_chkCats_0" type="checkbox" na

我继承了一个项目,其中包含一些糟糕的JavaScript,这些JavaScript依赖于硬编码的对象ID。
i、 很多地方都有类似的事情

var magazine = document.getElementById('repModuleDisplay__ctl3_chkCats_0');
当页面在我的UAT环境中呈现时,HTML看起来是这样的,一切正常

<input id="repModuleDisplay__ctl3_chkCats_0" 
    type="checkbox" name="repModuleDisplay:_ctl3:chkCats:0"  
    ... etc

使用.NET4并在要与js一起使用的控件上设置ClientMode属性

EG


asp.net控件必须使用clientID

'<%=mycontrol.ClientID %>'
“”

我能想到的最快、最简单的修复方法是使用控件的实际
ClientID
属性,而不是试图猜测生成的id可能是什么,如果代码到处都是,这可能不是特别快或简单:

// i've assumed that the control is named chkCats
var magazine = document.getElementById('<%= chkCats.ClientID %>');
//我假设控件名为chkCats
var杂志=document.getElementById(“”);
简要介绍了ASP.NET如何创建ID,所有其他海报都推荐了使用控件ClientID的正确解决方案

如果要避开ASP样式标记,另一个选项是在预渲染期间向页面发出一些js:

StringBuilder sb = new StringBuilder();
sb.AppendLine(string.Format("var myTextBox = document.getElementById('{0}');", MyTextBox.ClientID));
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "myElementDefinitions"))
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myElementDefinitions", sb.ToString());

然后在javascript代码中,您只需使用名称myTextBox引用它。此选项可能不适合您,这取决于您的代码以及您使用ASP标记引用同一控件id的频率。

遗憾的是,这不是一个选项。。。这是一个令人讨厌的项目,有些页面在.NET3.5中,有些在.NET2中,有些在.NET1.1中。。。猜猜是哪个版本导致了问题。Net 1.1我不确定更新整个开发、测试和生产环境以使用.NET4是否符合“快速修复”的条件@NeilD-你可能想把这个问题作为一个例子,咬紧牙关,至少升级1.1版本的东西。这一定是一场噩梦。@Paddy-哦,孩子。。。就可维护性问题而言,.NET1.1部分只是冰山一角。这是一个令人震惊的项目!谢谢卢克。。。唯一可能出现的问题是有大量的chkCat复选框,JavaScript应该只在单击一个特定复选框时启动(我知道…我知道…)。我会试一试,看看是否能让它工作。@Neld:另一种可能性(特别是如果复选框包含在某种容器中,如转发器),可能是在运行时使用JavaScript或类似于jQuery的东西在客户端找到适当的复选框。
// i've assumed that the control is named chkCats
var magazine = document.getElementById('<%= chkCats.ClientID %>');
StringBuilder sb = new StringBuilder();
sb.AppendLine(string.Format("var myTextBox = document.getElementById('{0}');", MyTextBox.ClientID));
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "myElementDefinitions"))
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myElementDefinitions", sb.ToString());