Как использовать ClientIDMode в ASP.NET 4

Значение ClientIDMode по умолчанию для страницы - AutoID. Значение по умолчанию ClientIDMode для элемента управления - Inherit. Если вы не установите ClientIDMode для страницы или для каких-либо элементов управления на странице, все элементы управления будут использовать алгоритм AutoID.

Это из msdn. Но когда я создавал веб-приложение в ASP.NET 4 или даже 3.5, все идентификаторы элемента управления - это то, что я написал для них. Они не генерируются алгоритмом autoId. Затем я попытался вручную добавить clientIDMode = "AutoID" к элементам управления, он также не работает так, как я ожидал. Так в чем проблема ? Есть ли какое-то правило, чтобы сделать это доступным?

Заранее спасибо,

ИЗМЕНЕНО

Это страница в формате ASPX

<div>
    <asp:Panel ID="Panel1" runat="server">
        <asp:Panel ID="Panel2" runat="server">
            <asp:Panel ID="Panel3" runat="server">
                <asp:Panel ID="Panel4" runat="server">
                    (:
                </asp:Panel>
            </asp:Panel>
        </asp:Panel>
    </asp:Panel>
</div>

Это вывод:

<div id="Panel1">
        <div id="Panel2">

                <div id="Panel3">

                    <div id="Panel4">
                        (:
                </div>

        </div>

    </div>
</div>

person Barış Velioğlu    schedule 30.08.2011    source источник


Ответы (2)


Причина, по которой вы получаете все свои идентификаторы такими, какие вы есть, заключается в том, что у .NET framework нет причин изменять их.

Если бы вы поместили свою панель в элемент управления Repeater, тогда все они изменились бы, чтобы избежать нескольких идентификаторов с одним и тем же именем.

Пример (неверная разметка):

<asp:Repeater id="repeater1" runat="server">
  <template>
      <asp:Panel id="Panel1" runat="server">
          <asp:Panel id="Panel2" runat="server">

          </asp:Panel>
      </asp:Panel>
  </template>
</asp:Repeater>

Ваш HTML, сгенерированный из этого, покажет, что идентификатор панели был изменен, чтобы наследовать от содержащего элемента управления. Что-то вроде repeater1_ct100_Panel1

То же самое происходит, когда вы используете главные страницы, держатели контента и элементы управления DataBound. .NET обновляет идентификаторы, чтобы избежать использования нескольких идентификаторов с одним и тем же именем.

person Tim B James    schedule 30.08.2011

Различия между разными значениями ClientIDMode можно четко увидеть, если вложить один элемент управления в другой; в режиме AutoId элементу присваивается имя после каждого родительского контейнера именования, а в режиме Статический запускается новая иерархия именования. Режим Predictable в основном используется с элементами управления привязкой данных, тогда как режим Inherit заставляет элемент управления использовать ClientIDMode своего родителя.

person Efran Cobisi    schedule 30.08.2011
comment
Полагаю, я использую вложенные элементы управления. - person Barış Velioğlu; 30.08.2011
comment
Ваши элементы управления вложены, но в вашем случае нет необходимости изменять идентификаторы. - person Tim B James; 30.08.2011