.NET 4.5中的INamingContainer

3

我们最近从.NET 3.5SP1升级到了.NET 4.5。我们发现使用INamingContainer接口的控件现在呈现其ClientID的方式有所不同。

微软的文档说明INamingContainer在控件层次结构中创建一个新的ID命名空间。

旧行为下,我们的ID看起来像这样:

<input id="MyContainer_txtName" />

但是现在我们得到了:
<input id="ctl00_ctl00_c_contentHolder_MyContainer_txtName" />

这个控件的前缀为ct100,它还包含内容保持器的控件名称。

一个使用它的示例类如下:

public class MyTextBox : System.Web.UI.WebControls.TextBox, INamingContainer
{

}

我们设置了ClientIDMode="AutoID"以实现向后兼容。
我们可以使用ClientID="static"手动为每个控件分配正确的ID,但这对我们来说需要完成大量工作。
我想了解为什么INamingContianer在早期版本的.NET中呈现的方式与现在不同。
提前致谢。

http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770142 - Tim Schmelter
谢谢Tim。ClientIDMode="AutoID"是为了向后兼容而存在的。 - Joel Cunningham
它只对实现了INamingContainer接口的控件表现出这种行为吗?像GridView这样在NamingContainer中的控件是否像3.5中一样有前缀? - Tim Schmelter
2个回答

2

重大变更发生在.NET4中:

ASP.NET 4中的ClientIDMode设置允许您指定ASP.NET为HTML元素生成id属性的方式。在之前的版本中, 默认行为等同于ClientIDMode的AutoID设置。然而,现在的默认设置是可预测的

如果您使用Visual Studio 2010将应用程序从ASP.NET 2.0或ASP.NET 3.5升级,则该工具会自动向Web.config文件添加一个设置,以保留早期版本.NET Framework的行为。但是,如果您通过将IIS中的应用程序池更改为目标.NET Framework 4来升级应用程序,则ASP.NET默认使用新模式。要禁用新的客户端ID模式,请在Web.config文件中添加以下设置:

<pages ClientIDMode="AutoID" / >

谢谢Tim。我们知道这个设置,但它并不能解决问题。我已经更新了我的问题以反映这一点。 - Joel Cunningham

1
我成功地通过使用可预测和静态的ClientModeID来解决了这个问题,如article所述。
帮助我解决问题的部分在末尾附近。
使用可预测设置时,父命名容器的影响
如果将 GridView 的 ClientIDMode 设置为 Predictable,则自动生成的 ID 将被移除,并附加行索引或指定的数据字段值,从而生成如下所示的 ID:
ContentPlaceHolder1_UserControlID_GridViewID_lblName_0 ContentPlaceHolder1_UserControlID_GridViewID_lblName_1 ContentPlaceHolder1_UserControlID_GridViewID_lblName_2 ...
请注意 ContentPlaceHolder ID 仍然是呈现的 ID 的一部分。我们可以通过将用户控件的 ClientIDMode 设置为 Static(可以通过用户控件的 @Control 指令完成此操作)来省略 ID 的此部分。这将导致如下的 ID:
UserControlID_GridViewID_lblName_0 UserControlID_GridViewID_lblName_1 UserControlID_GridViewID_lblName_2 ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接