ASP控件无序列表UL与嵌套列表

时间:2013-12-16 11:49:25

标签: c# asp.net

我尝试了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列表,点击项目后,如果存在嵌套项目,将检查db,并将它们作为嵌套ul添加到点击列表中。

由于性能的原因,我无法立即渲染整个菜单。

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

2 个答案:

答案 0 :(得分:2)

您需要使用嵌套转发器:

<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;
        }
    }
}

答案 1 :(得分:1)

如果您只需要访问代码隐藏中的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