ASP.Net从哪里获取其呈现的ID?

时间:2010-04-15 11:10:31

标签: asp.net javascript rendering

我继承了一个项目,其中包含一些依赖于硬编码对象id的讨厌的JavaScript 即有很多地方可以做这样的事情

var magazine = document.getElementById('repModuleDisplay__ctl3_chkCats_0');

当页面在我的UAT环境中呈现时,HTML看起来像这样,一切正常。

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

然而,当我把它放在我的生产环境中时,HTML突然就像这样:

<input id="repModuleDisplay_ctl03_chkCats_0" 
    type="checkbox" name="repModuleDisplay$ctl03$chkCats$0" 
    ... etc

ids的差异意味着JavaScript无法找到Element,并且失败。

在一个理想的世界中,我会删除错误的JavaScript并再次正确地执行它,但为了快速解决问题,我想知道是什么导致了两种环境之间渲染的差异。

有没有人有任何想法?

谢谢, 尼尔

4 个答案:

答案 0 :(得分:7)

我能想到的最快最简单的修复 - 如果代码遍布整个地方可能不是特别快速或简单 - 是使用控件的实际ClientID属性而不是尝试猜猜生成的id可能是什么:

// i've assumed that the control is named chkCats
var magazine = document.getElementById('<%= chkCats.ClientID %>');

答案 1 :(得分:4)

您必须将clientID用于asp.net控件。

'<%=mycontrol.ClientID %>'

答案 2 :(得分:2)

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

EG;

  <asp:TextBox ID="txtComment" runat="server" CssClass="myClass"
    ClientIDMode="Static" MaxLength="1024"></asp:TextBox>

答案 3 :(得分:1)

This link简要介绍了ASP.NET如何创建ID,所有其他海报都推荐使用控件的ClientID的正确解决方案。

如果你想避开ASP样式标签,那么另一种选择是在PreRender期间向你的页面发出一些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的频率。