Supongo que hay una razón válida para no utilizar el control del servidor web BulletedList. De todos modos, este es un ejercicio de programación interesante que ilustra los aspectos internos de la arquitectura Htmlservercontrol y cómo se asignan a las etiquetas HTML simples.
Las etiquetas HTML ul
y li
no están asignadas directamente como controles HTMLServer. Esto significa que incluso si agrega un atributo runat="server"
a la lista, sus contenidos no serán accesibles directamente como listitems.
Sin embargo, todos los controles no asignados directamente como controles del servidor Html son accesibles a través de la clase HtmlGenericControl
. Esto hace posible crear y modificar dichos controles dinámicamente.
La solución, por lo tanto, es doble:
- Hacer la lista desordenada
runat="server"
para que pueda acceder a él en el código del lado del servidor. Además, debe crear los elementos existentes en la lista runat="server"
, de lo contrario solo se podrá acceder a ellos como LiteralControl
que contiene los primeros dos elementos de lista como texto sin formato.
- En el código, acceda al contenido de la lista y añada un nuevo HtmlGenericControl del tipo "li".
La siguiente página (escueto sencilla) muestra este procedimiento:
<%@ 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>
Usando el asp: ¿BulletedList no es una opción? – miccet