【问题标题】:ASP.NET 4 changes with automatic names of controlsASP.NET 4 更改为控件的自动名称
【发布时间】:2010-04-13 13:14:50
【问题描述】:

我刚刚将一个应用从 .NET 2.0 更新到 .NET 4.0,我注意到以下内容。

例如我有以下控制:

<input type="hidden" name="ctl00$cphMain$hfdFueraHorarioOficinaConfirmado" 
 id="cphMain_hfdFueraHorarioOficinaConfirmado" value="False" />

然后在 javascript 中我之前这样做过:

 var hfdFueraHorarioOficinaConfirmado=document.getElementById('ctl00_cphMain_hfdFueraHorarioOficinaConfirmado');

但是在 html 源代码中检查 id 后,一旦它呈现并使用 firebug 等进行一些调试,它已经从:

ctl00_cphMain_hfdFueraHorarioOficinaConfirmado

到:

cphMain_hfdFueraHorarioOficinaConfirmado

谁能解释为什么?我应该基本上搜索并替换并删除ctl00吗?

显然,前面带有ctl00_ 的javascript 行返回null,因为它不存在,但删除它会返回对象。

非常感谢任何帮助或想法

【问题讨论】:

    标签: asp.net .net-4.0


    【解决方案1】:

    发生了一些看起来更好的变化,但微软创建了一个兼容性标志,您可以设置它以保持与 .NET 3.5 的向后兼容性 - see this article

    您可以在 web.config 文件中将 ClientIDMode 属性设置为 AutoID 以保留以前的行为,并在您开始对整个代码进行更改时逐渐在各个控件上覆盖它。

    【讨论】:

      【解决方案2】:

      在您的脚本文件中,您应该始终使用您在服务器端获得的 ClientID(并在页面上作为脚本变量输出)。

      我认为在 4.0 中还有一些设置控件命名方式的方法,您也许可以选择一个可以解决您的问题的设置:

      http://weblogs.asp.net/asptest/archive/2009/01/06/asp-net-4-0-clientid-overview.aspx

      【讨论】:

      【解决方案3】:

      ASP.Net 自动为服务器端控件生成客户端 ID。

      正如您所发现的,您不能依赖这些自动生成的名称保持不变。

      在 ASP.Net 4.0 中,您可以将ClientIDMode 属性设置为Static。然后,您的 ID 将原封不动地用作客户端 ID。

      在所有版本的 ASP.Net 中,您应该使用 ClientID 属性而不是对 ID 进行硬编码。

      例如:(在 ASPX 页面中)

      var hfdFueraHorarioOficinaConfirmado = 
          document.getElementById('<%= hfdFueraHorarioOficinaConfirmado.ClientID %>');
      

      【讨论】:

      • Static 并非如此。它可能根据容器而改变。
      • @Chris:不;它永远不会改变。
      • 我讨厌不同。但是如果在转发器中有标签控件,则无论 ClientIDMode 是静态还是 AutoID,标签的 ID 都会发生变化。中继器的名称将被添加到前面。因此,这取决于您的控件的父级是什么。
      • @Chris:仅当控件被重复进行数据绑定时。
      • ergo..它可能根据容器而改变。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多