我们最近从.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,但这对我们来说将是很多工作要完成的。
我想理解为什么INamingContianer不像以前在旧版.NET中那样呈现。
提前致谢。
答案 0 :(得分:2)
breaking change在.NET4中:
ASP.NET 4中的
ClientIDMode
设置允许您指定ASP.NET的方式 生成HTML元素的id属性。在之前的版本中 ASP.NET,默认行为相当于AutoID设置ClientIDMode
。但是,默认设置为现在可预测。如果使用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" / >
答案 1 :(得分:0)
我设法通过使用此article中所述的Predictable和Static ClientModeID来解决此问题。
帮助我解决问题的一点已接近尾声。
使用可预测设置时父命名容器的影响
...
如果将GridView的ClientIDMode设置为Predictable,则将其设置为 自动生成的ID将被删除,行索引或指定 将附加数据字段值,从而产生类似的ID 以下:
ContentPlaceHolder1_UserControlID_GridViewID_lblName_0 ContentPlaceHolder1_UserControlID_GridViewID_lblName_1 ContentPlaceHolder1_UserControlID_GridViewID_lblName_2 ......
请注意如何 ContentPlaceHolder ID仍然是呈现ID的一部分。我们可以 通过设置用户控件的ClientIDMode省略id的这一部分 静态,可以通过用户控件的@Control完成 指示。这会导致像这样的ID:
UserControlID_GridViewID_lblName_0 UserControlID_GridViewID_lblName_1 UserControlID_GridViewID_lblName_2
...