Веб-формы asp.net 4.0 - как сохранить ContentPlaceHolder1_ от идентификаторов клиента простым способом? - PullRequest
1 голос
/ 13 мая 2010

Я пытаюсь представить главные страницы на существующем сайте веб-форм, который избегает их использования из-за искажения идентификатора клиента в прошлом (и я не хотел иметь дело с искажениями и выполнял <% 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 *

Ответы [ 2 ]

2 голосов
/ 30 мая 2012
ClientIDMode = UI.ClientIDMode.Static

Вы должны установить это в «конструкторе».

0 голосов
/ 13 мая 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...