ASP.NET+SQL SERVER 动态加载菜单详解
2016-08-18 15:25
507 查看
最近在项目开发中遇到一个很糟糕的问题,解决方案网上也有不少,但是我采用的是三层架构的开发框架,所以自己也琢磨了一个办法。
就是从数据库取出数据,生成动态菜单,我这里采用的是用户自定义控件,以及递归的方法,当然这只是我自己的一个小小的解决方案,还有很多,比如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>
就是从数据库取出数据,生成动态菜单,我这里采用的是用户自定义控件,以及递归的方法,当然这只是我自己的一个小小的解决方案,还有很多,比如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>
相关文章推荐
- ASP.NET+SQL Server利用XML实现动态菜单
- Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载
- Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载
- Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载
- Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载
- Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载
- SolpartMenu的使用:(二)、在ASP.NET页面中使用SolpartMenu控件之动态的加载数据库中的数据来生成菜单
- SolpartMenu的使用:(二)、在ASP.NET页面中使用SolpartMenu控件之动态的加载数据库中的数据来生成菜单
- asp.net 动态加载用户控件注意
- asp.net 动态创建TextBox控件及状态数据如何加载
- ASP.NET获取各级目录Server.MapPath详解全
- ASP.NET动态加载CSS文件
- ASP.NET实现写入和读取图片(C#+SQL Server)
- ASP.NET中实现模版的动态加载
- asp.net 异步动态加载控件
- ASP.NET MVC动态加载数据
- 纯ajax+asp.net+sqlserver多方式分页
- ASP.NET动态设置页面标题的方法详解
- 解决 VS2013 ASP.NET 缺少 SQL Server Express
- 在Windows 2003 中发布 ASP.NET 2.0 无法写 SQL SERVER Express