Здравствуйте, 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>>