ASP控制带有嵌套列表的无序列表UL

本文关键字:列表 UL 无序 嵌套 控制 ASP | 更新日期: 2024-10-20 21:01:46

我尝试了Menu、TreeView、BulletedList、Repeater、HtmlGenericControl,但没有结果。

我想拥有的是呈现某种东西的asp控件:

<ul>
    <li><a href="#">Item 1</a></li>
    <li><a href="#">Item 2</a>
        <ul>
            <li><a href="#">Item 2.1</a></li>
        </ul>
    </li>
</ul>

例如,菜单显示SPAN no UL。

<asp:Menu runat="server">
     <Items>
          <asp:MenuItem Text="Item 1" />
          <asp:MenuItem Text="Item 2">
             <asp:MenuItem Text="Item 2.1" />
          </asp:MenuItem>
    </Items>
</asp:Menu>

我也试过

<asp:Menu RenderingMode="MenuRenderingMode" />

但它不起作用。我使用的是ASP.NET 3.5。

我需要创建动态ul列表,点击项目后,它将检查数据库中是否存在嵌套项目,并将它们作为嵌套ul添加到点击列表中。

由于性能问题,我不能同时呈现整个菜单。

对不起,如果我不是很清楚。谢谢你的帮助。

ASP控制带有嵌套列表的无序列表UL

您需要使用嵌套中继器:

<asp:Repeater ID="rptFoo" runat="server" OnItemDataBound="rptFoo_ItemDataBound">
   <HeaderTemplate>
     <ul>
   </HeaderTemplate>
   <ItemTemplate>
       <li>
           <asp:HyperLink ID="lnkFoo" runat="server" />
           <asp:Repeater ID="rptBar" runat="server" OnItemDataBound="rptBar_ItemDataBound">
               <HeaderTemplate>
                  <ul>
               </HeaderTemplate>
               <ItemTemplate>
                    <li><asp:HyperLink ID="lnkBar" runat="server" /></li>
               </ItemTemplate> 
               <FooterTemplate>
                  </ul>
               </FooterTemplate>
           </asp:Repeater>
      </li>
   </ItemTemplate> 
   <FooterTemplate>
     </ul>
   </FooterTemplate>
</asp:Repeater>

然后在ItemDataBound处理程序中,您需要检查每个顶级项是否有子元素,如果有,则将这些元素分配给子中继器和数据绑定,否则将其隐藏

protected void rptFoo_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
    {
        FooType obj = (FooType)e.Item.DataItem;
        Repeater rptBar = (Repeater)e.Item.FindControl("rptBar");
        if(obj.Children.Count() > 0)
        {
            rptBar.DataSource = obj.Children;
            rptBar.DataBind();
        }
        else
        {
            rptBar.Visible = false;
        }
    }
}

如果您只需要从codeehind访问ulli元素,您可以轻松地为它们添加runat="server"属性。id属性是必需的,以便能够引用单个元素:

<ul id="mainMenu" runat="server">
    <li id="mainMenuItem1" runat="server"><a href="#">Item 1</a></li>
    <li id="mainMenuItem2" runat="server"><a href="#">Item 2</a>
        <ul id="subMenu" runat="server">
            <li id="subMenuItem1" runat="server"><a href="#">Item 2.1</a></li>
        </ul>
    </li>
</ul>

该结构也可以使用HtmlGenericControl s从码背构建。

另一种选择是使用用户控件:http://msdn.microsoft.com/en-us/library/y6wb1a0e%28v=vs.100%29.aspx