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.
Убедитесь, что вы смотрите на идентификатор в сгенерированном источнике, а не на имя. Это ошибка, которую я сделал.