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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.