Я пытаюсь представить главные страницы на существующем сайте веб-форм, который избегает их использования из-за искажения идентификатора клиента в прошлом (и я не хотел иметь дело с искажениями и выполнял <% foo.ClientID%> везде :))
GOAL: использовать «статические» значения идентификаторов (независимо от того, что находится в атрибуте id серверного элемента управления) , за исключением для связанных с данными / повторяющихся элементов управления, которые могут нарушаться в этих случаях и, следовательно, требуются суффиксы или что-либо другое для различения ( в основном, предсказуемо)
Теперь, когда сайт перешел на ASP.NET 4.0, я сначала попытался использовать ClientIDMode of Static (в web.config), но это сломало слишком много мест, делая повторяющиеся элементы управления (например, флажки внутри gridview), так как все они приводили к с тем же идентификатором.
Итак, я попробовал Predictable (опять же, просто в web.config), чтобы повторяющиеся элементы управления не имели конфликтующих идентификаторов, и он хорошо работает за исключением , что заполнитель содержимого главной страницы (который действительно является контейнером именования) все еще отражается в итоговых идентификаторах клиента (например, ContentPlaceHolder1_someCheckbox).
Конечно, я мог бы оставить настройку web.config как статическую, а затем пройти через все привязанные к базе данных / повторяющиеся элементы управления, переключив их на Predictable, но я надеюсь, что есть какой-то более простой / простой способ получить этот эффект, не разбрасывая атрибуты ClientIDMode в том числе N мест (или расширить все эти элементы управления, связанные с данными, с помощью моего собственного пользовательского элемента управления, который просто устанавливает режим клиента или что-то еще).
Я даже думал о том, чтобы оставить web.config установленным в static и сделать обработчик главной или базовой страницы (preinit? Не уверен, сработает ли это или нет), который будет идти по элементам управления OfType <INamingContainer
> () (может быть лучший выбор для типа, но это кажется хорошим начальным выбором, если посмотреть на повторитель и вид сетки), а затем установить для них значение Предсказуемо, чтобы я получал статическое для всех моих «обычных» вещей за пределами повторяющихся элементов управления, но не сталкивался со статическим внутри такие вещи, как gridview / ретранслятор / и т. д.
Я не вижу способа пометить заполнитель содержимого так, чтобы он «отказывался» от включения в дочерние идентификаторы - установка идентификатора заполнителя на пустой / пустой не работает, так как это обязательный атрибут :)
В тот момент я подумал, что есть лучший / более простой способ, которого мне не хватало, и решил спросить об этом:)
Edit: я думал об изменении всех моих вызовов jquery 'fetch by id' с $ ('# foo') на fetch_by_id ('foo'), а затем заставил эту функцию вернуть 'правильную', проверив $ ('# foo '). length, а затем $ (' # ContentPlaceHolder1_foo '). length (и, возможно, другие шаблоны) или даже просто верните $ (' # foo, # ContentPlaceHolder1_foo ') (опять же, потенциально другие шаблоны), но изменив все места Я извлекаю элементы по id, тоже выглядела довольно некрасиво, и я хотел бы избежать этого уровня абстракции, если это возможно сделать так легко:)
Edit2: WRT с использованием jQuery-селектора id $ = 'foo':
я беспокоюсь о том, чтобы делать такие вещи (хотя это может быть более воображаемым, чем реальным), когда один из идентификаторов на странице заканчивается другим. Например, если на странице есть элементы с идентификаторами 'foo' и 'barfoo', тогда id $ = 'foo' также будет случайно включать 'barfoo'. Конечно, есть много методов для предотвращения этого (например, суффиксы с типом элемента, например, fooCheckbox и barfooButton или что-то еще), но я не хотел сканировать существующий источник и / или применять новое правило для именования.
Поскольку не все элементы управления являются серверными элементами управления, я также не могу $ = '_ foo', так как нормальный div id = "foo" не будет найден (и я бы предпочел просто избегать runat = "server") исказить имя:)
еще одна вещь, которую я рассмотрел, это сделать уникальное имя класса css для каждого элемента и вместо этого выбрать его (поскольку класс, очевидно, не искажается), но это очень глупо и, конечно, запутывает вещи при выполнении «настоящего» CSS работа :) 1030 *