INamingContainer in .NET 4.5

本文关键字:NET in INamingContainer | 更新日期: 2023-09-27 17:53:48

我们最近从。net 3.5SP1升级到。net 4.5。我们发现使用INamingContainer接口的控件现在以不同的方式呈现它们的ClientID。

MS文档说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,但这将是我们需要完成的大量工作。

我想了解为什么inamingcontainer不像以前在。net的旧版本中那样呈现。

INamingContainer in .NET 4.5

突破性更改在。net 4:

ASP中ClientIDMode的设置。. NET 4允许您指定ASP。网生成HTML元素的id属性。在以前版本的ASP。. NET的默认行为相当于的AutoID设置ClientIDMode。但是,默认设置是,现在可预测

如果您使用Visual Studio 2010从ASP升级您的应用程序。网2.0或ASP。NET 3.5时,该工具会自动向Web添加设置。的早期版本的行为net框架。但是,如果通过更改IIS中的应用程序池,目标是。net Framework 4, ASP。网络使用默认为新模式。要禁用新的客户端ID模式,请添加Web中的下列设置。配置文件:

<pages ClientIDMode="AutoID" / >

我设法通过使用本文中描述的可预测的和静态的ClientModeID来解决这个问题。

帮助我解决这个问题的部分在结尾。

使用可预测设置

时父命名容器的影响

如果你将GridView的ClientIDMode设置为Predictable,则将删除自动生成的id,并指定行索引数据字段值将被追加,从而产生像:

ContentPlaceHolder1_UserControlID_GridViewID_lblName_0ContentPlaceHolder1_UserControlID_GridViewID_lblName_1ContentPlaceHolder1_UserControlID_GridViewID_lblName_2...

注意ContentPlaceHolder ID仍然是渲染ID的一部分。我们可以通过设置用户控件的ClientIDMode来省略id的这一部分转换为Static,这可以通过用户控件的@Control来完成指令。这将导致像这样的id:

UserControlID_GridViewID_lblName_0UserControlID_GridViewID_lblName_1UserControlID_GridViewID_lblName_2