Re[7]: Как избавиться от ID на страницах?
От: mogadanez Чехия  
Дата: 01.03.07 14:42
Оценка: 36 (5)
#Имя: FAQ.ServerControlNotRenderingId
Здравствуйте, Prodmitry, Вы писали:

P>Наверное, не понял поста. Как сделать лейбл, который не будет рендерить свой ID?


исходный проблемный код
        <asp:Repeater runat="server" DataSource='<%#new int[][]{ new int[]{1,0}, new int[]{0,1} } %>'>
            <ItemTemplate>
                <asp:Repeater runat="server" DataSource='<%#Container.DataItem %>'>
                    <ItemTemplate>
                        <meta:Label runat="server" id="lbl" text='<%#Container.DataItem %>'/></ItemTemplate>
                </asp:Repeater><br /></ItemTemplate>
        </asp:Repeater>


его вывод:

<span id="ctl02_ctl00_ctl00_ctl00_lbl">1</span>
<span id="ctl02_ctl00_ctl00_ctl01_lbl">0</span><br />

<span id="ctl02_ctl01_ctl00_ctl00_lbl">0</span>
<span id="ctl02_ctl01_ctl00_ctl01_lbl">1</span><br />



1 если нужен именно Label( т.е. отрендереный текст в теге span ):
1.1 Убираем ID

контролка наследная от Label
namespace Controls
{
    public class NoIdWriter:HtmlTextWriter
    {
        public NoIdWriter(TextWriter writer) : base(writer) {}


        public override void AddAttribute(HtmlTextWriterAttribute key, string value)
        {
            if ( key != HtmlTextWriterAttribute.Id )
                base.AddAttribute(key, value);
        }
    }


    public class LabelEx : Label
    {
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
           base.AddAttributesToRender( new NoIdWriter( writer ) );
        }
    }
}


использование
        <asp:Repeater runat="server" DataSource='<%#new int[][]{ new int[]{1,0}, new int[]{0,1} } %>'>
            <ItemTemplate>
                <asp:Repeater runat="server" DataSource='<%#Container.DataItem %>'>
                    <ItemTemplate>
                        <meta:LabelEx runat="server" id="lbl" text='<%#Container.DataItem %>'/></ItemTemplate>
                </asp:Repeater><br /></ItemTemplate>
        </asp:Repeater>


вывод
<span>1</span>
<span>0</span><br />

<span>0</span>
<span>1</span><br />



1.2 Если надо сохранить уникальные ID'ы но сделать их короче то код такой:

    public class LabelEx : Label
    {
        public const string prefix = "c";
        public override string UniqueID
        {
            get
            {
                if (unique_id_ == null)
                {
                    int count = -1;
                    lock (Page.Items.SyncRoot)
                    {
                        count = Page.Items["UniqueID_Counter"] != null ? (int) Page.Items["UniqueID_Counter"] : 0;
                        Page.Items["UniqueID_Counter"] = ++count;
                    }
                    unique_id_ = prefix + count;
                }
                return unique_id_;
            }
        }
        private string unique_id_;
    }


использование как выше

результат:
<span id="c1">1</span>
<span id="c2">0</span><br />

<span id="c3">0</span>
<span id="c4">1</span><br />




2. если нужен просто текст, и допустимо его без span'a то можно так:

        <asp:Repeater runat="server" DataSource='<%#new int[][]{ new int[]{1,0}, new int[]{0,1} } %>'>
            <ItemTemplate>
                <asp:Repeater runat="server" DataSource='<%#Container.DataItem %>'>
                    <ItemTemplate>
                        <asp:Literal runat="server" id="lit" text='<%#Container.DataItem %>' /></ItemTemplate>
                </asp:Repeater><br /></ItemTemplate>
        </asp:Repeater>

серверные Id указываются можно в codebehind к ним обращаться, текст также во вьюстейте. выведет:
1
0<br />

0
1<br />


в принципе span можно и руками присать если очень хочется без ID и не хочется делать наследный класс:
        <asp:Repeater runat="server" DataSource='<%#new int[][]{ new int[]{1,0}, new int[]{0,1} } %>'>
            <ItemTemplate>
                <asp:Repeater runat="server" DataSource='<%#Container.DataItem %>'>
                    <ItemTemplate>
                        <span><asp:Literal runat="server" id="lit" text='<%#Container.DataItem %>' /></span></ItemTemplate>
                </asp:Repeater><br /></ItemTemplate>
        </asp:Repeater>


вывод как в 1.1


Выбирайте.
... << RSDN@Home 1.2.0 alpha rev. 662>>
Re[2]: Как избавиться от ID на страницах?
От: Prodmitry Россия  
Дата: 05.03.07 06:19
Оценка: :)))
Здравствуйте, parapet, Вы писали:

P>Здравствуйте, Prodmitry, Вы писали:


P>>Добрый день.


P>>Имеется такая проблема:

P>>На странице постоянно формируются многокилометровые ID для всех серверных элементов, включая неизменяемые. Подскажите, как от них можно избавиться? А то приходится просто от них отказываться...

P>ээээ, а чем они мешают?


Тем, что трафик жрут в неимоверных количествах.
Re[8]: Как избавиться от ID на страницах?
От: Prodmitry Россия  
Дата: 01.03.07 15:07
Оценка: -1
Здравствуйте, mogadanez, Вы писали:

Строгое предупреждение за вопиющее избыточное цитирование! Еще один случай — и приму меры. Уважайте других участников форума и не цитируйте бессмысленно! Gollum

Блин, че ж так сложно то все? Неужели в мелкософте одни бараны сидят???
Re[9]: Как избавиться от ID на страницах?
От: mogadanez Чехия  
Дата: 01.03.07 15:16
Оценка: +1
Здравствуйте, Prodmitry, Вы писали:

P>Блин, че ж так сложно то все? Неужели в мелкософте одни бараны сидят???


где сложно то? самый простой способ не писать ID серверному элементу — тогда он и не отрендерится. по моему проще некуда.
иличто заменить Label на Literal или LabelEx? тоже не скпер сложно
... << RSDN@Home 1.2.0 alpha rev. 662>>
Re[9]: Как избавиться от ID на страницах?
От: rameel https://github.com/rsdn/CodeJam
Дата: 01.03.07 16:34
Оценка: +1
Здравствуйте, Prodmitry, Вы писали:

P>Блин, че ж так сложно то все?


Сложнее только не оверквотить, да?
... << RSDN@Home 1.2.0 alpha rev. 669>>
Как избавиться от ID на страницах?
От: Prodmitry Россия  
Дата: 01.03.07 10:07
Оценка:
Добрый день.

Имеется такая проблема:
На странице постоянно формируются многокилометровые ID для всех серверных элементов, включая неизменяемые. Подскажите, как от них можно избавиться? А то приходится просто от них отказываться...
Re: Как избавиться от ID на страницах?
От: mogadanez Чехия  
Дата: 01.03.07 11:16
Оценка:
P>Имеется такая проблема:
P>На странице постоянно формируются многокилометровые ID для всех серверных элементов, включая неизменяемые. Подскажите, как от них можно избавиться? А то приходится просто от них отказываться...

можно называть контролы одной буквой
Re[2]: Как избавиться от ID на страницах?
От: Prodmitry Россия  
Дата: 01.03.07 11:40
Оценка:
Здравствуйте, mogadanez, Вы писали:

P>>Имеется такая проблема:

P>>На странице постоянно формируются многокилометровые ID для всех серверных элементов, включая неизменяемые. Подскажите, как от них можно избавиться? А то приходится просто от них отказываться...

M>можно называть контролы одной буквой


Итак обзывю коротко, но когда много контейнеров, получаеццо что-то вроде ctl00_a1_pb1_ctl223_lb2. Приятого в этом мало, с учетом того, что тому же лейблу ID не впился в одно место. Кто-нибудь знает альтернативу?
Re[3]: Как избавиться от ID на страницах?
От: mogadanez Чехия  
Дата: 01.03.07 12:34
Оценка:
P>Итак обзывю коротко, но когда много контейнеров, получаеццо что-то вроде ctl00_a1_pb1_ctl223_lb2. Приятого в этом мало, с учетом того, что тому же лейблу ID не впился в одно место. Кто-нибудь знает альтернативу?

1. сделать лейбл свой который не будет ID рендерить
2. сделать фильтр на отрендереный html страницы и вырезать идишки перед отправкой клиенту
3. вместо того же лейбла можно использовать LiteralControl или вообще не использовать серверные контролы где можно без них
4. label'у можно не указывать ID вообще. тогда он и не отрендерится.

<asp:Label runat="server" Text='<%#Container.DataItem %>' />
->
<span>1</span>


5. у контрола есть метод internal PreventAutoID() — но пока я не знаю что из него можно извлечь
Re[4]: Как избавиться от ID на страницах?
От: Prodmitry Россия  
Дата: 01.03.07 13:27
Оценка:
Здравствуйте, mogadanez, Вы писали:

P>>Итак обзывю коротко, но когда много контейнеров, получаеццо что-то вроде ctl00_a1_pb1_ctl223_lb2. Приятого в этом мало, с учетом того, что тому же лейблу ID не впился в одно место. Кто-нибудь знает альтернативу?


M>1. сделать лейбл свой который не будет ID рендерить

M>2. сделать фильтр на отрендереный html страницы и вырезать идишки перед отправкой клиенту
M>3. вместо того же лейбла можно использовать LiteralControl или вообще не использовать серверные контролы где можно без них
M>4. label'у можно не указывать ID вообще. тогда он и не отрендерится.

M>
M><asp:Label runat="server" Text='<%#Container.DataItem %>' />
->>
M><span>1</span>
M>


M>5. у контрола есть метод internal PreventAutoID() — но пока я не знаю что из него можно извлечь


Да я то сейчас именно так и поступаю, но просто неудобно оъявлять сотню переменных в кассе формы прото для того,чтобы потом их прибиндить. А как избавиться от ID, я так и не понял.
Re[5]: Как избавиться от ID на страницах?
От: mogadanez Чехия  
Дата: 01.03.07 13:56
Оценка:
Здравствуйте, Prodmitry, Вы писали:



P>Да я то сейчас именно так и поступаю, но просто неудобно оъявлять сотню переменных в кассе формы прото для того,чтобы потом их прибиндить.


зачем переменные? не понимаю...

P>А как избавиться от ID, я так и не понял.


то что я перечислил не подходит? я бы выбрал 1й либо 3й вариант.
если ты хочешь штатное решение — оно вряд ли есть. коль уж ты указал ID — оно отрендерится. а для контролов в NamingContainer'ax ClientId еще и автогенерится, дабы не иметь дублированые ИДы на клиенте.
... << RSDN@Home 1.2.0 alpha rev. 662>>
Re[6]: Как избавиться от ID на страницах?
От: Prodmitry Россия  
Дата: 01.03.07 14:05
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Здравствуйте, Prodmitry, Вы писали:




P>>Да я то сейчас именно так и поступаю, но просто неудобно оъявлять сотню переменных в кассе формы прото для того,чтобы потом их прибиндить.


M>зачем переменные? не понимаю...


P>>А как избавиться от ID, я так и не понял.


M>то что я перечислил не подходит? я бы выбрал 1й либо 3й вариант.

M>если ты хочешь штатное решение — оно вряд ли есть. коль уж ты указал ID — оно отрендерится. а для контролов в NamingContainer'ax ClientId еще и автогенерится, дабы не иметь дублированые ИДы на клиенте.

Наверное, не понял поста. Как сделать лейбл, который не будет рендерить свой ID?
Re[9]: Как избавиться от ID на страницах?
От: tripolox Россия  
Дата: 02.03.07 18:34
Оценка:
ИМХО можно сделать так:

в cs делаем protected проперюю

protected String MegaLabelText
{
get { return _megaLabelText; }
}

а в aspx

...
<span><%= MegaLabel %></span>


что присвоеш на сервере переменной _megaLabelText, то и отобразится на странице.

А вообще я не понял зачем нужны серверные контролы без идентификаторов?
Re[10]: Как избавиться от ID на страницах?
От: Prodmitry Россия  
Дата: 02.03.07 20:39
Оценка:
Здравствуйте, tripolox, Вы писали:

Избыточное цитирование удалено. Gollum

А я вот не понимаю, зачем серверным не-input контролам идентификаторы...
Re[11]: Как избавиться от ID на страницах?
От: mogadanez Чехия  
Дата: 02.03.07 23:19
Оценка:
P>А я вот не понимаю, зачем серверным не-input контролам идентификаторы...

так не указыай их ... они и не будут рендерится...


<asp:Label runat="server" Text='1' />  --> <span>1</span>
Re: Как избавиться от ID на страницах?
От: parapet  
Дата: 04.03.07 11:39
Оценка:
Здравствуйте, Prodmitry, Вы писали:

P>Добрый день.


P>Имеется такая проблема:

P>На странице постоянно формируются многокилометровые ID для всех серверных элементов, включая неизменяемые. Подскажите, как от них можно избавиться? А то приходится просто от них отказываться...

ээээ, а чем они мешают?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: Как избавиться от ID на страницах?
От: Mike Chaliy Украина http://chaliy.name
Дата: 15.03.07 16:13
Оценка:
Здравствуйте, mogadanez, Вы писали:

P>>А я вот не понимаю, зачем серверным не-input контролам идентификаторы...


M>так не указыай их ... они и не будут рендерится...



M>
M><asp:Label runat="server" Text='1' />  --> <span>1</span>
M>



Как бы теперь еще заставить дизайнер не тупить .
А тут я живу и пишу...
Re[13]: Как избавиться от ID на страницах?
От: mogadanez Чехия  
Дата: 16.03.07 12:30
Оценка:
MC>Как бы теперь еще заставить дизайнер не тупить .

использовать п. 1.1 из Re[7]: Как избавиться от ID на страницах?
Автор: mogadanez
Дата: 01.03.07



P.S. я сам вообще дизайнер не помню когда включал последний раз
... << RSDN@Home 1.2.0 alpha rev. 676>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.