ASP.Net - Naming Containers и ClientIDMode="Статический"

В документации MSDN говорится о ClientIdMode:

Статический Значение 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"  />

Для правильной меры я также установил режим клиента в источнике управления, хотя я не уверен, какой из них нужен:

<%@ 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"/>

Что мне не хватает? Есть ли способ достичь того, что я ищу (более короткие идентификаторы), не устанавливая "static" для каждого элемента управления в пользовательском элементе управления?

РЕДАКТИРОВАТЬ:

На самом деле, посмотрев ближе, я обнаружил, что атрибут ID работает так, как описано в MSDN, однако атрибут name по-прежнему является полной конкатенацией иерархии именования-контейнера.

Учитывая сайт высокой сложности, имена и идентификаторы этих элементов управления начинают занимать большую часть полосы пропускания (размер разметки). Кажется, я не могу найти хорошего обходного пути, чтобы уменьшить наценку в этом отношении.

2 ответа

Вы должны иметь этот элемент управления в панели или что-то с runat="server" а сам пользовательский элемент управления является контейнером имен для своих дочерних элементов. Если вы хотите, чтобы идентификаторы соответствовали вашим именам без изменений, вы можете использовать Predictable (IIRC) режим идентификатора клиента.

Примечание: хотя, глядя на документацию для Predictable похоже, это не так, я уверен, что это то, что я всегда использовал для получения "чистых" идентификаторов.NET в ASP.NET.

Кроме того, если вы хотите применить ClientIDMode глобально, укажите его в файле web.config в атрибуте <pages> элемент.

ClientIdMode="Static" работает как описано Microsoft.

Убедитесь, что вы смотрите на идентификатор в сгенерированном источнике, а не на имя. Это ошибка, которую я сделал.

Другие вопросы по тегам