我有一个可以在我们的舞台/测试环境中运行的Web应用程序,但是一旦我们将它移动到我们的生产环境,就会发生奇怪的事情。所有控件ID都会改变。例如,标签从ctl00_cphMainContent_lblPetName
转到_ctl0_cphMainContent_lblPetName
。为什么会这样?什么可能导致这样的事情发生。我所知道的唯一两个差异是生产环境有HTTPS,我已禁用调试。
答案 0 :(得分:4)
由于生成客户端ID的方式可能会在不同版本的框架之间发生变化,因此您不应该依赖于特定的模式。
应使用ClientID
和UniqueID
属性来确定为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);