Есть ли способ предотвратить изменение идентификаторов элементов на главных страницах?

Я собираюсь добавить главные страницы к существующему сайту, но обнаружил, что как только я это сделаю, к идентификаторам элементов добавляется код (например, ctl00_MainPageContent_).

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

Я понимаю, что могу заменить его на <%= Element.ClientID %>, но было бы здорово, если бы я мог полностью отключить это поведение.

Итак, могу ли я сохранить оригинальные идентификаторы?


person Michael Haren    schedule 10.05.2009    source источник


Ответы (3)


Ответ на этот вопрос уже был дан в предыдущем сообщении: Удалить созданный идентификатор MasterPage

Решение переопределяет событие визуализации с помощью следующего кода:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    Dim Html As New StringWriter()
    Dim Render As New HtmlTextWriter(Html)
    MyBase.Render(Render)
    writer.Write(Html.ToString().Replace("name=""ctl00$ContentBody$", _ 
                  "name=""").Replace("id=""ctl00_ContentBody_", "id="""))
End Sub
person Jose Basilio    schedule 10.05.2009
comment
Интересный подход. Есть ли какие-либо соображения по производительности, чтобы уловить таким образом вывод всей страницы? Или возможные проблемы с изменениями в соглашении об именах в будущем? - person Michael Haren; 10.05.2009
comment
В этом случае снижение производительности незначительно. Однако это следует рассматривать как обходной путь, а не как постоянное решение, поскольку вы обходите способ, которым мастер-страницы генерируют уникальные идентификаторы. Тем не менее, одним положительным моментом является то, что если соглашение об именах для элементов главной страницы изменится в будущем, вам нужно будет внести только одно изменение в событие Render. - person Jose Basilio; 10.05.2009
comment
Не уверен, что это правильный путь ... Жесткое кодирование - это плохо, и если вы переставляете контейнеры ... логика ломается. - person Ben; 25.05.2009
comment
Меня удивляет, почему MS не использовала другой атрибут вместо ID. Возможно, нам придется установить 2 идентификатора: один для клиентской стороны, другой для серверной, но кажется, что лучше прервать проверку, чем вызвать эти проблемы. : / - person ingredient_15939; 04.11.2011

Вы можете переопределить ClientID и UniqueID в элементах управления. Это из статьи Рика Страла, здесь.

public override string UniqueID
{
    get
    {
        return this.ID;
    }
}

public override string ClientID
{   
    get
    {
        return this.ID;
    }
}
person Phaedrus    schedule 10.05.2009
comment
Это тоже интересная идея, но я не думаю, что она сработает для меня, поскольку у нее есть серьезные ограничения на обратные публикации, и я пытаюсь ограничить изменения, которые мне нужно внести в существующую базу кода. Спасибо! - person Michael Haren; 10.05.2009

Этот вопрос стар как грязь, но новый способ решения - ClientIDMode="Static".

person Barry Franklin    schedule 10.10.2019