ASP.Net - 命名容器和客户端 IDmode= "Static"



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(,而不在用户控件中的每个控件上设置"static"?

编辑:

事实上,仔细观察后,我发现ID属性的工作方式与MSDN中描述的一样——然而name属性仍然是命名容器层次结构的完整串联。

给定一个高度复杂的站点,这些控件的名称和ID开始占据大部分带宽(标记大小(。在这方面,我似乎找不到任何好的变通办法来减少标记。

您必须在Panel或具有runat="server"的东西中拥有此控件,并且自定义控件本身是其子控件的命名容器。如果您希望标识符的命名方式不变,则需要使用Predictable(IIRC(客户端id模式。

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

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

ClientIdMode="Static"确实可以按照Microsoft的描述工作。

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

最新更新