动态从数据库读取菜单(ASP.NET版)

这几天一直打算做个从数据读取导航菜单的效果,以前做的时候都是写死的(太死了),好了话不多说,先看效果!

我是个小菜,高手请不要喷!我在网上查了好久,说用menu控件,但是我用了不太好!最后我决定用repeater的嵌套来实现这个效果。先数据库结构吧!

前台的代码:

复制代码
 1 <body>
 2     <form id="form1" runat="server">
 3     <div class="menu">
 4         <ul class="nav">
 5             <asp:Repeater ID="rptNav" runat="server" OnItemDataBound="rptNav_ItemDataBound">
 6                 <ItemTemplate>
 7                     <li><a href='<%# DataBinder.Eval(Container.DataItem,"navUrl")%>'>
 8                         <%# DataBinder.Eval(Container.DataItem,"navTitle") %></a>
 9                         <asp:Repeater ID="rptSub" runat="server">
10                             <HeaderTemplate>
11                                 <ul class="sub-nav">
12                             </HeaderTemplate>
13                             <ItemTemplate>
14                                 <li><a href='<%# DataBinder.Eval(Container.DataItem,"navUrl")%>'>
15                                     <%# DataBinder.Eval(Container.DataItem,"navTitle") %></a></li>
16                             </ItemTemplate>
17                             <FooterTemplate>
18                                 </ul>
19                             </FooterTemplate>
20                         </asp:Repeater>
21                     </li>
22                 </ItemTemplate>
23             </asp:Repeater>
24         </ul>
25     </div>
26     </form>
27 </body>
28 </html>
复制代码

后台的实现:

复制代码
using System;
using System.Collections.Generic;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;

namespace LearnTest
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                InitData();
            }
        }


        /// <summary>
        /// 初始化数据
        /// </summary>
        private void InitData()
        {
            SqlConnection cn = new SqlConnection(@"server=(local);uid=sa;pwd=xjai18749695757;database=Test");
            SqlDataAdapter da = new SqlDataAdapter("select * from nav where parentId = 0",cn);
            DataSet ds = new DataSet();
            cn.Open();          //打开数据库连接
            da.Fill(ds);
            rptNav.DataSource = ds.Tables[0].DefaultView;
            rptNav.DataBind();
            cn.Close();
        }

        //绑定一级菜单时绑定二级菜单
        protected void rptNav_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            //判断repeater的数据绑定列
            if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
            {
                //当前一级菜单的ID
                string id = ((DataRowView)(e.Item.DataItem)).Row["Id"].ToString();
                //找到下面的repeater控件 
                Repeater rpt = (Repeater)e.Item.FindControl("rptSub");
                if (rpt!=null)
                {
                    SqlConnection cn = new SqlConnection(@"server=(local);uid=sa;pwd=123456;database=Test");
                    SqlCommand cmd = new SqlCommand("select * from nav where parentId =@parentId",cn);
                    cmd.Parameters.Add("@parentId",SqlDbType.VarChar,11).Value = id;
                    cn.Open();
                    rpt.DataSource = cmd.ExecuteReader();
                    rpt.DataBind();
                    cn.Close();
                    
                }

            }
        }
    }
}
复制代码

这就是用repeater进行嵌套来进行实现的!

posted @   Java_Swing  阅读(860)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示