Я предполагаю, что у вас есть веская причина не использовать элемент управления веб-сервера BulletedList. В любом случае, это интересное упражнение по программированию, которое иллюстрирует внутреннюю часть архитектуры Htmlservercontrol и то, как они отображаются на простые теги HTML.
Теги HTML ul
и li
не отображаются напрямую как HTMLServercontrols. Это означает, что даже если вы добавите атрибут runat="server"
в список, его содержимое не будет напрямую доступно в виде элементов списка.
Однако все элементы управления, не отображаемые напрямую как элементы управления Html-сервером, доступны через класс HtmlGenericControl
. Это позволяет динамически создавать и изменять такие элементы управления.
Таким образом, решение имеет два аспекта:
- Создайте неупорядоченный список
runat="server"
, чтобы вы могли получить к нему доступ в коде на стороне сервера. Кроме того, вы должны сделать существующие элементы в списке runat="server"
, иначе они будут доступны только как LiteralControl
, который содержит первые два элемента списка в виде простого текста.
- В коде получите доступ к содержимому списка и добавьте в него новый HtmlGenericControl типа "li".
Следующая страница (простой) демонстрирует эту процедуру:
<%@ Page Language="VB" AutoEventWireup="false" %>
<%@ Import Namespace="System.Collections.Generic" %>
<script runat="server">
Private Shared addedItems As List(Of HtmlGenericControl)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
'On first load, instantiate the List.
addedItems = New List(Of HtmlGenericControl)
End If
End Sub
Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'Add the previously created items to the UL list.
'This step is necessary because
'...the previously added items are lost on postback.
For i As Integer = 0 To addedItems.Count - 1
myList.Controls.Add(addedItems.Item(i))
Next
'Get the existing no. of items in the list
Dim count As Integer = myList.Controls.Count
'Create a new list item based on input in textbox.
Dim li As HtmlGenericControl = CreateBulletItem()
'Add the new list item at the end of the BulletedList.
myList.Controls.AddAt(count, li)
'Also add this newly created list item to the generic list.
addedItems.Add(li)
End Sub
Private Function CreateBulletItem() As HtmlGenericControl
Dim li As New HtmlGenericControl("li")
li.InnerText = txtNewItem.Value
li.Attributes("class") = "myItemClass"
Return li
End Function
</script>
<html>
<head runat="server">
<title>Test Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<ul id="myList" class='myClass' runat="server">
<li runat="server" class="myItemClass">Item 1</li>
<li runat="server" class="myItemClass">Item 2</li>
</ul>
<input type="text" id="txtNewItem" runat="server" />
<asp:Button ID="btn1" runat="server" Text="Add" OnClick="btn1_Click" />
</div>
</form>
</body>
</html>