2010-08-20 1 views
23

У меня есть список UL в странице ASPX:Добавить в список из отделенного кода C# Asp.net

<ul id="tabs"> 
<li id="tab1"><a href="ztab1.htm">Tab 1</a></li> 
<li id="tab2"><a href="ztab2.htm">Tab 2</a></li> 
<li id="tab3"><a href="ztab3.htm">Tab 3</a></li> 
<li id="tab4"><a href="ztab4.htm">Tab 4</a></li> 
</ul> 

Я хотел бы добавить элементы списка динамически из коды, включая HREF запись для каждого нового элемента списка.

Как?

ответ

49

Вы должны отметить свой ул в качестве контроля на стороне сервера, а затем обработать «новый элемент» в качестве HtmlGenericControl и вставить его в коллекцию элементов управления:

<ul runat="server" id="tabs"> 

Чтобы добавить элемент, создать новый элемент и добавить его:

HtmlGenericControl li = new HtmlGenericControl("li"); 
tabs.Controls.Add(li); 

HtmlGenericControl anchor = new HtmlGenericControl("a"); 
anchor.Attributes.Add("href", "page.htm"); 
anchor.InnerText = "TabX"; 

li.Controls.Add(anchor); 
+0

Я получаю UL, не допускает ошибки управления детьми – Si8

+1

это должно быть tabs.Controls.Add (li) –

+0

Dim newLi = New HtmlGenericControl ("li") Dim anchor = New HtmlGenericControl ("a") anchor.Attributes.Add ("href", itemrow.Item (" reg_url "). ToString(). Trim()) anchor.InnerText = itemrow.Item (" conf_name ") newLi.Controls.Add (anchor) eventList.Controls.Add (newLi) – mzonerz

7

Используйте asp:bulletedList и список будет намного проще.

<asp:BulletedList id="blTabs" 
    BulletStyle="Disc" 
    DisplayMode="LinkButton" 
    runat="server"> 
    <asp:ListItem Value="ztab1.htm">tab1</asp:ListItem> 
    <asp:ListItem Value="ztab2.htm">tab2</asp:ListItem> 
    <asp:ListItem Value="ztab3.htm">tab3</asp:ListItem> 
</asp:BulletedList> 

Код За:

ListItem li = new ListItem(); 
    li.Value = "*.html"; //html goes here i.e. xtab1.html 
    li.Text = "New Text"; //text name goes i.e. here tab1 
    blTabs.Items.Add(li); 
5

Этот результат такой же, как GenericTypeTea-х годов, но разница заключается в HTML является «написано» в коде позади и вводили в страницу.

В разметке:

<asp:Literal id="litMarkup" runat="server" /> 

В своем коде позади:

List<string> locations // however this initialized 

StringBuilder sb = new StringBuilder(); 

sb.Append("<ul id=\"tabs\">"); 

for (int i = 0; i < locations.Count; i++) 
{ 
    sb.Append("<li id=\"tab" + i.ToString() + "\"><a href=\"" + locations[i] + "\">Tab " + i.ToString() + "</a></li>"); 
} 

sb.Append("</ul>"); 

litMarkup.Text = sb.ToString(); 
+0

Удивительно, как я отмечен отлично работающим и действительным ответом без каких-либо объяснений. –

+0

Это случается, приятель, не принимайте это лично. Некоторые пользователи слишком трусливы, чтобы дать объяснение для их downvote. Я не давал нисходящего звена, но я предполагаю, что вы его получили, потому что это непродуманный способ сделать это.Не потому, что он не дает того же выхода, а потому, что это абсолютный кошмар для обслуживания, намного больше кода и довольно нечитаемый. Мы давно запретили подобный код из наших проектов. «TagHelper» в ASP.Net MVC - отличный способ сделать что-то похожее на ваш ответ. – GenericTypeTea

+0

@GenericTypeTea - Спасибо за ваше объяснение, я не знал, что использование литерала считается плохой практикой. –

4

Вы можете создать динамический UL с использованием asp:Repeater управления

Вы можете использовать ретранслятор следующим способом, в вашем .aspx файле

<asp:Repeater ID="menu_ul_1" runat="server"> 
    <HeaderTemplate> 
    <ul class="my-menu"> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <li> 
     <a href='<%# Eval("href_li")%>'> 
     <%# Eval("DisplayText")%></a> 
     </li> 
    </ItemTemplate> 
    <FooterTemplate> 
     </ul> 
    </FooterTemplate> 
</asp:Repeater> 

И вы можете поместить динамические данные с помощью кода позади в .aspx.cs файле

protected void Page_Load(object sender, EventArgs e) 
{ 
    DataTable newsDataTable = new DataTable(); 

    // add some columns to our datatable 
    newsDataTable.Columns.Add("href_li"); 
    newsDataTable.Columns.Add("DisplayText"); 

    for (int i = 1; i <= 5; i++) 
    { 
     DataRow newsDataRow = newsDataTable.NewRow(); 
     newsDataRow["href_li"] = "?sc=item_" + i; 
     newsDataRow["DisplayText"] = "List Item # "+i; 
     newsDataTable.Rows.Add(newsDataRow); 
    } 
    menu_ul_1.DataSource = newsDataTable; 
    menu_ul_1.DataBind(); 
} 

Результат: Вы получите следующий HTML через этот код

<ul class="my-menu"> 
    <li><a href='?sc=item_1'>List Item # 1</a> </li> 
    <li><a href='?sc=item_2'>List Item # 2</a> </li> 
    <li><a href='?sc=item_3'>List Item # 3</a> </li> 
    <li><a href='?sc=item_4'>List Item # 4</a> </li> 
    <li><a href='?sc=item_5'>List Item # 5</a> </li> 
</ul> 
+0

Вау ... Удивительный! Как я могу конвертировать ваш код для использования SQL-соединения? http://stackoverflow.com/questions/23565614/how-to-use-dataset-instead-of-datatable-in-c-sharp – Si8

+0

Я действительно получил его работу, но как я могу манипулировать классом для разных 'LI'? ? – Si8

+0

Не работал для меня. Я получил пустую 'li' – SearchForKnowledge

0

вложен его с родительским ребенком, использовать свои элементы как указано ниже

Dim newLi = New HtmlGenericControl("li") 
     Dim anchor = New HtmlGenericControl("a") 
     anchor.Attributes.Add("href", itemrow.Item("reg_url").ToString().Trim()) 
     anchor.InnerText = itemrow.Item("conf_name") 
     newLi.Controls.Add(anchor) 
     eventList.Controls.Add(newLi) 
Смежные вопросы