asp.net 4,0 веб-формы - как не допустить ContentPlaceHolder1_ в клиентский идентификатор простым способом?

Я пытаюсь представить основные страницы существующему сайту веб-форм, это избегало использования их из-за клиентского идентификационного искажения в прошлом (и меня, не желая иметь дело с искажением и выполнением <нечто %. % ClientID> везде :)

ЦЕЛЬ: используйте 'статические' значения идентификаторов (независимо от того, что находится в идентификационном атрибуте управления сервером) за исключением с привязкой к данным / повторяющиеся средства управления, которые повредились бы для тех случаев и поэтому нуждались бы в суффиксах или безотносительно дифференцироваться (в основном, Предсказуемый)

Теперь, когда сайт мигрировал на ASP.NET 4.0, я сначала попытался использовать ClientIDMode Статических (в web.config), но это повредило слишком много мест, делающих повторяющиеся средства управления (флажки внутри gridviews, например), так как они все закончились с тем же идентификатором.

Так, я затем попробовал Предсказуемый (снова, только в web.config) так, чтобы повторяющиеся средства управления не имели конфликтующего идентификатора, и он работает хорошо за исключением того, что основной заполнитель содержания страницы (который является действительно именованным контейнером) все еще отражается в получающемся клиентском идентификаторе (например, ContentPlaceHolder1_someCheckbox).

Конечно, я мог оставить web.config, устанавливающий как статичный, и затем пройти весь, связал с данными/повторил средства управления, переключают их на Предсказуемый, но я надеюсь, что существует некоторый более легкий/более простой способ получить тот эффект, не имея необходимость рассеивать атрибуты ClientIDMode в тех количество N мест (или расширять все те связанные с данными средства управления с помощью моего собственного usercontrol, который просто устанавливает clientidmode, или безотносительно).

Я даже думал об отъезде web.config набор к статическому и выполнению ведущего устройства или basepage обработчика (preinit? не уверенный, если бы это работало бы или не), который пошел бы Средства управления обходом с OfType<INamingContainer> () (мог бы быть лучший выбор на типе, но это походит на хороший стартовый выбор, смотрящий на повторитель и gridview) и затем устанавливает тех, которые к Предсказуемому, таким образом, я стал бы статичным для всех своих 'нормальных' вещей за пределами повторения средств управления, но не имел бы для контакта со статическими внутренними вещами как gridview/repeater/etc.

Я не вижу способа отметить заполнителя содержания, таким образом, что он 'отказывается' от того, чтобы быть включенным в дочерний идентификатор - установка идентификатора заполнителя для опустевшего/очищения не работает, поскольку это - необходимый атрибут :)

В той точке я полагал, что был лучший/более простой способ, относительно которого я отсутствовал и решенный для выяснения ТАК :)

Править: Я думал об изменении всей моей 'выборки идентификатором' вызовы jQuery от $ ('#foo') к fetch_by_id ('нечто'), и затем наличие той функции возвращаются 'правильный один' путем проверки $ ('#foo') .length и затем $ ('#ContentPlaceHolder1_foo') .length (и возможно другие шаблоны) или даже просто имеют его $ возврата ('#foo, #ContentPlaceHolder1_foo') (снова, потенциально другие шаблоны), но изменяющий все места я выбираю элементы идентификатором, казался довольно ужасным также, и я хотел бы избежать что уровень абстракции, если это возможно, чтобы сделать так легко :)

Edit2: WRT использование селектора jQuery id$ = 'нечто':

мое беспокойство, делающее такую вещь (хотя это может быть более предположено, чем реальный), - когда один из идентификатора на странице заканчивается другим. Например, если страница будет иметь элементы с идентификатором 'нечто' и 'barfoo' затем id$ =, то 'нечто' будет случайно включать 'barfoo' также. Конечно, существует много методов для предотвращения этого (как добавление суффикса типа элемента, таким образом, fooCheckbox и barfooButton или безотносительно), но я не хотел должным быть сканировать существующий источник и/или осуществлять новое правило для именования.

С тех пор не все средства управления являются управлением сервером, я не могу $ = '_foo' ни один начиная с нормального идентификатора отделения =, "нечто" не будет найдено (и я избежал бы runat = "сервер" только для искажения имени :)

другая вещь, которую я рассмотрел, делала уникальное имя класса CSS на элемент и выбирала на том вместо этого (так как класс, очевидно, не становится искаженным), но это очень hacky, чтобы сделать так и конечно измазывает вещи при выполнении 'реальной' работы CSS :)

1
задан James Manning 13 May 2010 в 19:19
поделиться

1 ответ

Честно говоря, я не знаю, есть ли простой способ сделать это, но, учитывая, что вы используете jQuery, то, что я делал в прошлом, я использовал атрибут ends с методом selector.

Поскольку .Net добавляет ваш "статический" id в конец сгенерированного id, вы можете получить его с помощью селектора jquery $("input[id$='yourstaticid']").

Я знаю, что это не то решение, которое вы ищете, но это упростит вашу 'fetch_by_id'.

Надеюсь, это поможет или хотя бы даст вам идею.

0
ответ дан 3 September 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: