ASP.net, почему он использует длинные имена элементов? - PullRequest
1 голос
/ 21 марта 2011
<asp:Textbox runat="server" Id="Username" />

Это может выглядеть как:

<input type="text" id="ctl00_mainContent_Username" />

Но в web.config, если я это сделаю:

<pages clientIDMode="Static">

Это выглядит как:

<input type="text" id="Username" />

Я выбрал второй вариант, поэтому идентификаторы клиентов проще и не динамичны, что означает, что я могу иметь весь свой внешний Javascript, потому что мне не нужно использовать Username.ClientID.

Но почему он спроектирован таким образом? Почему это дает странные имена вещи? Второй способ кажется более простым для работы.

Ответы [ 4 ]

3 голосов
/ 21 марта 2011

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

Подобно большинству схем «автоматически украшают это имя, чтобы дубликат никогда не встречался», имя заканчивается длинным и безобразным.

Вы должны помнить, что первоначальная концепция ASP.NET заключалась в том, что никто никогда не будет смотреть на выходной HTML или заботиться о таких деталях, как идентификаторы, потому что все это было абстрагировано для вас. Так что простая, уродливая схема оформления имени была бы хороша - это просто внутренняя деталь реализации.

2 голосов
/ 21 марта 2011

Основной причиной ClientID является пользовательский контроль. Подумайте о том, чтобы иметь 2-3 текстовых элемента управления с одинаковым именем в 3 различных пользовательских элементах управления, размещенных на одной странице. Чем бы вы отличались друг от друга ....

1 голос
/ 21 марта 2011

Краткий ответ

Поскольку Asp.net помещает все содержимое страницы в один элемент FORM, следовательно, может происходить дублирование, и с помощью этой техники он пытается избежать этого (с успехом).

Длинный (эр) один

Когда вся страница находится внутри одного FORM, мы рискуем дублировать входные имена (представьте себе редактируемый список объектов, которые имеют одинаковые свойства, которые также дают им одинаковые имена на входах). Следовательно, Asp.net называет все элементы управления на основе их именованного контейнера (INamingContainer интерфейс) и количества. Это самый простой способ избежать любых конфликтов имен.

Когда вышел Asp.net 1.0, не было особой необходимости называть эти элементы управления по-разному, но в последнее время в толстых клиентских приложениях это возникает (представьте себе стили CSS для каждого идентификатора и клиентские скрипты).

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

Если вы вместо этого будете использовать статический режим, вы получите преимущество от хороших (эр) имен, но рискуете их дублировать, о чем вам следует знать.

0 голосов
/ 21 марта 2011

Я просто объясню, что я понимаю.

Для именования элемента ASP.net называет элемент в соответствии с его уровнем иерархии, например, для вашего примера, это не та страница, где иерархияэто похоже на

MasterPage // MasterPage has <asp:ContentPlaceHolder ID="mainContent" runat="server" />
    Page // textbox is inside the <asp:Content ID="Content1" ContentPlaceHolderId="mainContent" runat="server">

Где главная страница имеет элемент управления контейнера mainContent, в котором находится страница.Поскольку ASP.net находится внутри одной формы, ASP.net называет его таким образом для уникальности элемента.ct100 - это префикс для элемента управления, и каждый элемент управления, содержащий элемент управления, объединяется иерархически.

...