3

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

提前致谢。

4

2 回答 2

2

.NET4 中的重大变化是:

ClientIDModeASP.NET 4 中的设置允许您指定 ASP.NET 如何为 HTML 元素生成 id 属性。在以前版本的 ASP.NET 中,默认行为等同于 ClientIDMode. 但是,默认设置现在是 Predictable

如果您使用 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" / >
于 2013-01-17T12:03:19.133 回答
1

我设法通过使用本文所述的可预测和静态 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
...

于 2013-01-24T21:21:08.987 回答