ASP.NET+SQL SERVER 动态加载菜单详解

来源:互联网 发布:域名注册备案查询 编辑:程序博客网 时间:2024/05/03 00:40

 最近在项目开发中遇到一个很糟糕的问题,解决方案网上也有不少,但是我采用的是三层架构的开发框架,所以自己也琢磨了一个办法。

就是从数据库取出数据,生成动态菜单,我这里采用的是用户自定义控件,以及递归的方法,当然这只是我自己的一个小小的解决方案,还有很多,比如AJax ,jquery等

解决步骤以及源码附上给大家,希望对大家有帮助,同时也希望大家能给点建议啥的,共同进步嘛!

第一步:新建自定义控件比如(Menu.ascx)

页面代码:

script type="text/javascript"> 

<!--

    navHover = function () {

        var lis = document.getElementById("navmenu").getElementsByTagName("LI");

        for (var i = 0; i < lis.length; i++) {

            lis[i].onmouseover = function () {

                this.className += " iehover";

            }

            lis[i].onmouseout = function () {

                this.className = this.className.replace(new RegExp(" iehover\\b"),"");

        } } }

    if (window.attachEvent) window.attachEvent("onload", navHover);

-->

</script> 

<ul id="navmenu">

    <%= _menu%>

</ul>


第二步:在用户自定义控件上操作前端代码如下:(这里CSS样式自己写去)


第三步:在用户自定义的后台动态添加html控件,采用递归的方法可以无限极的添加菜单栏,代码如下:

 public partial class Meun : System.Web.UI.UserControl

    {

        protected string _menu =string.Empty;

        private static CCourse cc =new CCourse();

        protected void Page_Load(object sender,EventArgs e)

        {

            if (!IsPostBack)

            {

                BindMenu();

            }

        }

        private void BindMenu()

        {

            DataTable dt = cc.GetAllClassInfo();//调用方法,取出数据

            if (dt != null && dt.Rows.Count > 0 && dt.Rows[0] != null)

            {

                StringBuilder sb = new StringBuilder();

                DataRow[] rows = dt.Select("ParentID=0");//取出一级菜单

                foreach (DataRow  drin rows)//遍历所有数据

                {

                    string id = dr["Id"].ToString();//取出ID

                    string name = dr["ClassName"].ToString();//取出名称

                    sb.Append("<li><a href=\"#\">" + name +"</a>\r\n");//href可以写需要的链接地址

                    sb.Append(GetSubMenu(id, dt));

                    sb.Append("</li>\r\n");

                }

                _menu = sb.ToString();//加载列

            }

        }

        private string GetSubMenu(string pid,DataTable dt)

        {

            StringBuilder sb = new StringBuilder();

            DataRow[] rows = dt.Select("ParentID=" + pid);//取出一级列表一下与其父级对应的子菜单

            sb.Append("<ul>\r\n");

            foreach (DataRow drin rows)

            {

                string id = dr["Id"].ToString();

                string name = dr["ClassName"].ToString();

                 //动态加载html控件,实现无限极的遍历

                sb.Append("<li><a href=\"http://#\">" + name +"</a>\r\n");

                sb.Append(GetSubMenu(id, dt));  //递归调用

                sb.Append("</li>\r\n");

            }

            sb.Append("</ul>\r\n");

            return sb.ToString();

        }

    }

第四步:首页直接引用这个页面就可以了,大功告成了。

<%@ Register Src="~/MeunHelp/LeftMenu.ascx" tagname="LeftMenu" tagprefix="uc1" %>

 <div class="lesson_classfiy_nav">//动态菜单栏加载

        <ul>

            <uc1:LeftMenu ID="LeftMenu1" runat="server" />

         </ul>

    </div>



1 0
原创粉丝点击