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的旧版本中那样呈现。
突破性更改在。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
…