2010-04-15 51 views
2

我已经继承了一些依赖硬编码对象id的令人讨厌的JavaScript项目。
即有很多地方确实是这样ASP.Net从哪里获取其呈现的ID?

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不能找到元素,并失败。

在一个理想的世界,我想放弃了越野车的JavaScript,并再次做正确,但对于一个快速解决,我想知道是什么原因造成这两个环境之间呈现差异。

有没有人有任何想法?

感谢, 尼尔

回答

7

最快和最简单的解决我能想到的 - 它可能不是特别快或容易,如果代码是所有的地方 - 是使用控制的实际ClientID属性,而不是试图你猜怎么生成的ID可能是:

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

感谢卢克......唯一潜在的呃逆是有chkCat复选框的负载,并且JavaScript应该只在点击一个特定的时候触发(我知道......我知道......)。我会放弃它,看看我能否实现它。 – NeilD 2010-04-15 16:46:57

+1

@NeilD:另一种可能性(特别是如果复选框包含在中继器等某种容器中)可能是使用JavaScript(或者类似jQuery)在运行时在客户端查找相应的复选框。 – LukeH 2010-04-15 16:56:21

2

使用.NET4并设置要与JS使用您的控件的ClientIDMode属性。

EG;

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

可惜不是一个选项...这是一个讨厌的项目,在.net 3.5中的一些页面,一些在.net 2中,以及一些在.net 1.1中...... 猜猜哪个版本导致了问题? .Net 1.1 – NeilD 2010-04-15 11:15:48

+0

我不确定更新整个开发,测试和生产环境以使用.NET4将有资格成为“快速修复”! – LukeH 2010-04-15 11:15:52

+0

你让我在那里...但要记住的东西:) – GordonB 2010-04-15 11:19:31

4

您必须为asp.net控件使用clientID。

'<%=mycontrol.ClientID %>' 
1

This link给你的ASP.NET如何创建IDS,和所有的其他海报推荐使用控件的客户端ID的正确的解决方案的简要说明。

如果你想避开的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的频率。