【问题标题】:.Net adding a prefix ctl00_CPHPageContents_ to control IDs.Net 添加前缀 ctl00_CPHPageContents_ 来控制 ID
【发布时间】:2011-09-14 11:47:13
【问题描述】:

我在 .net 框架 4 中有一个 asp.net C# Web 表单应用程序 在我的页面中,当我查看 html 源代码时,它会将控件 ID 更改为 ctl00_CPHPageContents_txtUserID 实际上它是 txtUserID

此应用程序最初是在 Framework 3.5 中生成的,并且生成的 ID 类似于 CPHPageContents_txtUserID

简而言之,在 Framework 3.5 中,ID 是 CPHPageContents_txtUserID,而现在在 Framework 4 中,ID 是 ctl00_CPHPageContents_txtUserID,这破坏了我们的自动化测试。我可以删除这个由 Framework 4 添加的 ctl00 吗?

【问题讨论】:

标签: asp.net .net-4.0 clientid


【解决方案1】:

检查您页面的ClientIDMode;这是 .NET 4 中的一项新功能,可让您更好地控制 Web 表单生成的 ID。虽然如果它在前面添加一个 ctl100_,这意味着有一个新的服务器端控件包装了 CPHPageContents,这是以前没有的。

【讨论】:

  • 是的,我知道 ClientIDMode,但我现在不想更改它,因为它会破坏我们的自动化测试。但我认为我们没有添加任何包装 CPHPageContents 的控件。那么“ctl00”可能来自哪里?
  • 控件 ID 的生成方式发生了变化,或者它们是层次结构中以前不存在的新服务器端控件。如果您使用母版页,您是否检查了层次结构中是否存在其他控件。您还可以设置一个调试点并找到 id 为“ctl100”的控件并查看它是什么(假设它存在于页面上)。
  • 如果 ClientModeId 设置为 AutoID,刚刚发现它是由 .net 添加的。
【解决方案2】:

在这里找到解决方案http://weblogs.asp.net/scottgu/archive/2010/03/30/cleaner-html-markup-with-asp-net-4-web-forms-client-ids-vs-2010-and-net-4-0-series.aspx

将 ClientIDMode 设置为 Predictable 会删除 ct100_ 前缀。

【讨论】:

    【解决方案3】:

    ClientIDMode 是最好的方法。如果您将其设置为“静态”,则页面中控件的 ID 将是您设置的 ID。但是,如果您正在维护一个旧项目并且出于某种原因不得不坚持使用旧版本的框架,您可以将以下内容添加到您的页面中:

    <asp:HiddenField runat="server" ID="aspPrefix" />
    <div id="idPrefix" style="display:none" ><%= aspPrefix.ClientID %></div>
    

    然后,从 javascript 中添加:

    var hiddenFieldId = $('#idPrefix').text();
    ver controlPrefix = hiddenFieldId.substr(0, hiddenFieldId.length - 9);  // 9 chars in 'aspPrefix'
    

    使用前缀,您现在可以获取页面中其他控件的 ID。

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      相关资源
      最近更新 更多