ASP.Net-命名容器和ClientMode=";“静态”;

ASP.Net-命名容器和ClientMode=";“静态”;,asp.net,c#-4.0,user-controls,naming-containers,Asp.net,C# 4.0,User Controls,Naming Containers,MSDN文档说明了与ClientMode有关的内容: StaticClientID值设置为ID属性的值。如果控件是命名容器,则该控件将用作 它所包含的任何控件的命名容器层次结构的顶部 包含 资料来源: 然而,我并不认为“最高层”的业务是这样的。例如,我有一个usercontrol: <uc1:WidgetsListControl runat="server" id="WidgetsListControl" ClientIDMode="Static" /> 我错过了什么?有没有一种

MSDN文档说明了与ClientMode有关的内容:

StaticClientID值设置为ID属性的值。如果控件是命名容器,则该控件将用作 它所包含的任何控件的命名容器层次结构的顶部 包含

资料来源:

然而,我并不认为“最高层”的业务是这样的。例如,我有一个usercontrol:

<uc1:WidgetsListControl runat="server" id="WidgetsListControl" ClientIDMode="Static"  />
我错过了什么?有没有一种方法可以实现我想要的(更短的ID),而不必在用户控件中的每个控件上设置“static”

编辑:

实际上,在仔细观察之后,我发现ID属性的工作方式与MSDN中所描述的相同,但是name属性仍然是命名容器层次结构的完整连接


给定一个高度复杂的站点,这些控件的名称和ID开始占用大部分带宽(标记大小)。在这方面,我似乎找不到任何好的解决方法来精简标记。

您必须在面板或带有
runat=“server”
的东西中拥有此控件,并且自定义控件本身是其子项的命名容器。如果您希望标识符是您命名它们的方式而不做任何更改,那么您需要使用
可预测的
(IIRC)客户机id模式

注意:尽管查看了
Predictable
的文档,情况似乎并非如此,但我确信这正是我一直用来在ASP.NET中获取“clean.NET”标识符的方法

此外,如果要全局应用ClientIDMode,请在web.config文件中
元素的属性中指定它。

ClientIDMode=“Static”的工作方式与Microsoft所述相同

确保您查看的是生成的源中的id,而不是名称。
这就是我犯的错误。

自定义控件不是总是为其子控件命名的容器吗?这不是默认的行为吗?另外,这是一个非常简单的示例,具有典型的母版页>页面>用户控制场景。但在将一个网站更新为一个web应用程序后,我突然发现“在当前上下文中不存在”。但仅限于用户控件。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WidgetsListControl.ascx.cs" Inherits="WebApplication1.WidgetsListControl" EnableViewState="false" ClientIDMode="Static" %>
<asp:TextBox ID="testTextBox" runat="server" />
<input name="ctl00$MainContent$WidgetsListControl$testTextBox" id="testTextBox" type="text"/>