2013-05-30 31 views
3

MSDN文档状态相对于所述的ClientIDMode:ASP.Net - 命名容器和的ClientIDMode =“静态”

静态的客户端ID值被设置为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开始占用大部分带宽(标记大小)。我似乎无法找到任何好的解决方法来减少这方面的标记。

+0

我从来没有遇到ClientIDMode的问题。但是在将网站更新为Web应用程序后,我突然发现“在当前上下文中不存在”。但仅限于userControls。 – Mike

回答

1

您必须在面板或runat="server"内拥有此控件,并且自定义控件本身是其子项的命名容器。如果您希望标识符是您没有改变的名称,那么您需要使用Predictable(IIRC)客户端ID模式。

注意:虽然看Predictable的文档,但这似乎并不是这种情况,我确定这是我一直用来在ASP.NET中清理.NET标识符的东西。

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

+0

自定义控件是否永远是其子项的命名容器?这不是默认行为吗?此外,这是一个非常简单的示例,其中包含典型的主页面>页面>用户控制场景。 –

0

ClientIdMode =“Static”按照Microsoft的描述工作。

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