ASP.Net - 命名容器和ClientIDMode =“静态”

时间:2013-05-30 15:45:42

标签: asp.net c#-4.0 user-controls naming-containers

关于ClientIdMode的MSDN文档说明:

  

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

来源:http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientidmode%28v=vs.100%29.aspx

但是,我并没有找到“层次结构的顶层”业务。例如,我有一个usercontrol:

<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开始占据带宽的大部分(标记大小)。我似乎找不到任何好的解决方法来减少这方面的标记。

2 个答案:

答案 0 :(得分:1)

您必须在Panel或具有runat="server"的内容中拥有此控件,并且自定义控件本身是其子级的命名容器。如果您希望标识符为您的名称而无需更改,则您需要使用Predictable(IIRC)客户端ID模式。

注意:虽然查看Predictable的文档似乎并非如此,但我确信这是我一直习惯于在ASP.NET中获得“干净”的.NET标识符。

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

答案 1 :(得分:0)

ClientIdMode =“静态”的确如Microsoft所述。

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