MSDN 文档中关于 ClientIdMode 的说明:
静态 ClientID 值设置为 ID 属性的值。如果控件是命名容器,则该控件用作它所包含的任何控件的命名容器层次结构的顶部。
来源:http: //msdn.microsoft.com/en-us/library/system.web.ui.control.clientidmode%28v=vs.100%29.aspx
但是,我并没有发现“层次结构的顶部”业务就是这种情况。例如,我有一个用户控件:
<uc1:WidgetsListControl runat="server" id="WidgetsListControl" ClientIDMode="Static" />
为了更好地衡量,我也在控制源中设置了 clientidmode,尽管我不确定需要哪一个:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WidgetsListControl.ascx.cs" Inherits="WebApplication1.WidgetsListControl" EnableViewState="false" ClientIDMode="Static" %>
在用户控件中,我有一个文本框:
<asp:TextBox ID="testTextBox" runat="server" />
我的期望是文本框将被命名为WidgetsListControl$testTextBox
但是,我在查看源代码时发现的是:
<input name="ctl00$MainContent$WidgetsListControl$testTextBox" id="testTextBox" type="text"/>
我错过了什么?有没有一种方法可以实现我正在寻找的(较短的 id),而无需在用户控件中的每个控件上设置“静态”?
编辑:
实际上,仔细观察后,我发现 ID 属性的工作方式与 MSDN 中描述的一样 - 但是 name 属性仍然是命名容器层次结构的完整串联。
给定一个高度复杂的站点,这些控件的名称和 ID 开始占用大部分带宽(标记大小)。我似乎找不到任何好的解决方法来减少这方面的标记。