动态导入新菜单
这几天一直打算做个从数据读取导航菜单的效果,以前做的时候都是写死的(太死了),好了话不多说,先看效果!
我是个小菜,高手请不要喷!我在网上查了好久,说用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进行嵌套来进行实现的!