控件ID在环境之间呈现不同

时间:2009-07-04 21:24:54

标签: .net asp.net vb.net

我有一个可以在我们的舞台/测试环境中运行的Web应用程序,但是一旦我们将它移动到我们的生产环境,就会发生奇怪的事情。所有控件ID都会改变。例如,标签从ctl00_cphMainContent_lblPetName转到_ctl0_cphMainContent_lblPetName。为什么会这样?什么可能导致这样的事情发生。我所知道的唯一两个差异是生产环境有HTTPS,我已禁用调试。

3 个答案:

答案 0 :(得分:4)

由于生成客户端ID的方式可能会在不同版本的框架之间发生变化,因此您不应该依赖于特定的模式。

应使用ClientIDUniqueID属性来确定为html代码生成的ID和名称。

ClientID属性包含生成的id,例如,您可以将其与Javascript中的document.getElementById方法一起使用。

UniqueID属性包含生成的名称,例如,如果您阅读使用Request.Form集合中的表单发布的值,则可以使用该名称。

答案 1 :(得分:1)

您的web.configs有所不同。客户端ID生成的行为取决于EnableLegacyRendering。请查看您的web.config的xhtmlConformance元素。如果它是Legacy你会得到“_ctl”,如果没有 - “ctl”。

答案 2 :(得分:0)

诀窍是让知道控制ID的服务器将其发送到客户端JavaScript,然后使用它。

通常的做法是这样的:

var btn1 = document.getElementById(" <%= button1.ClientID %>");

我一直很讨厌这个,实际上,你是在运行时编写所有的JavaScript。相反,我喜欢的是让页面(或控件)发出一个包含所需的所有控件ID(或其他服务器端值)的类。

我发布了一个例子,但我暂时没有这样做,而且我没有。基本上,创建一个JavaScript类,其中包含您需要的每个控件ID的成员,并将其注册到页面。然后注册一个类似这样的启动脚本:

myPage_Instance.btn1 = <%= button1.ClientID %>; // Better - do it in the codebehind
// more of the same

您的代码现在可以是:

var btn1 = document.getElementById(myPage_Instance.btn1);