.NET 4.5中的INamingContainer

时间:2013-01-17 11:55:33

标签: c# asp.net webforms inamingcontainer

我们最近从.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中那样呈现。

提前致谢。

2 个答案:

答案 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
  ...