【问题标题】:ASP.Net - Naming Containers and ClientIDMode="Static"ASP.Net - 命名容器和 ClientIDMode="Static"
【发布时间】:2013-05-26 06:48:27
【问题描述】:

关于 ClientIdMode 的 MSDN 文档说明:

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

【问题讨论】:

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

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


【解决方案1】:

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

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

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

【讨论】:

  • 自定义控件不总是作为其子控件的命名容器吗?这不是默认行为吗?此外,这是一个非常简单的示例,具有典型的母版页 > 页面 > 用户控制场景。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2017-11-30
    • 2010-11-23
    相关资源
    最近更新 更多