ASP.NET如何动态创建菜单? 如何动态创建一个菜单,要求后台代码实现,针对不同的用户可以显示不同的菜单项,不同的页面不同的需求都用不同的菜单项? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般采用第三方控件,比如:Infragistics的UltraWebMenu 1、这个你可以借用微软的控件treeview,然后不同用户你输出的不同的XML信息给你这个控件进行绑定;2、如果有直接的已经写好的div之类的静态代码,你可以直接使用前台绑定,后台输出这些html组合的数据到前台,至于数据怎么生成,根据你用户的不同权限 或者 不同分类的用户 输出不同的代码到前台页面进行绑定就行了3、如果是每个页面都不一样,那么建议你写一个输出菜单类,然后根据不同的权限或者页面来进行输出,也是后台输出数据到前台绑定希望好运。 自带的Treeview也挺好用的 把用户权限存进数据库读权限的时候根据此来 加载不同的菜单可以直接输出菜单并拼接html组合或者借助第三方控件 用自带的TreeView导航,在后台判断用户身份,不同身份拼不同的节点 使用dtree 根据不同的权限绑定不同的页面 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="MyControl_WebUserControl" %><asp:TreeView ID="TreeView1" runat="server" Height="163px" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" Width="118px"></asp:TreeView>using System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using System.Collections.Generic;public partial class MyControl_WebUserControl : System.Web.UI.UserControl{ protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BranchInfo(); } } /// <summary> /// 根据ID查询机信息中的名称添加到树形父节点 /// </summary> private void BranchInfo() { IList<BranchInfo> branchInfos = DHOffice.BLL.BrInfoManager.GetList(); foreach (BranchInfo branch in branchInfos) { TreeNode tnBranch = new TreeNode(branch.BranchName, branch.BranchId.ToString(), "", "", "main"); tnBranch.Target = "a"; tnBranch.ImageUrl = "/WebUI/Images/menuclose.gif"; this.TreeView1.Nodes.Add(tnBranch); DepartInfo(tnBranch.ChildNodes, branch.BranchId); } } /// <summary> /// 根据ID查询出信息中的名称添加到树形根节点 /// </summary> /// <param name="tn"></param> /// <param name="branchId"></param> private void DepartInfo(TreeNodeCollection tn, int branchId) { IList<DepartInfo> departInfos = DepartInfoManager.GetList(branchId); foreach (DepartInfo depart in departInfos) { TreeNode tnDepart = new TreeNode(depart.DepartName, depart.DepartId.ToString(), "", "", "main"); tnDepart.Target = "b"; tnDepart.ImageUrl = "/WebUI/Images/OpenTree.gif"; tn.Add(tnDepart); DisplayUser(tnDepart.ChildNodes, depart.DepartId); } } /// <summary> /// 根据ID查询信息中的姓名添加到树形子节点 /// </summary> /// <param name="tn"></param> /// <param name="departId"></param> private void DisplayUser(TreeNodeCollection tn, int departId) { IList<UserInfo> users = DHOffice.BLL.UserInfoManager.GetList(departId); foreach (UserInfo user in users) { TreeNode tnUser = new TreeNode(user.UserName, user.UserId.ToString(), "", "", "main"); tnUser.Target = "c"; tnUser.ImageUrl = "/WebUI/Images/person.gif"; tn.Add(tnUser); } } /// <summary> /// 获取节点值的事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) { //获取到节点的值 TreeNode node = TreeView1.SelectedNode; //判断 if (node.Target != "c") { Response.Write("<script>alert('你选择不是,请重新选择');</script>"); } else { //if选择的是“你选择不是,请重新选择”,else将选择人员添加 ListItem item = new ListItem(); item.Text = node.Text; item.Value = node.Value; ListBox listBox = this.Parent.FindControl("lstPreContractUsers") as ListBox; listBox.Items.Add(item); } }}这个是动态的,仅供参考 我用的标单验证,定义三个权限组,每个权限组对应不同的菜单,就直接用的if else<% if (Roles.IsUserInRole("Role1")) { %> <ul class="leftmenulist"> <li> <asp:HyperLink ID="lnkCreateUser" Text="´´½¨Óû§" NavigateUrl="~/SystemPages/CreateUser.aspx" Target="_self" runat="server" EnableViewState="false" /></li> <br /> <br /> </ul> <% } else if (Roles.IsUserInRole("Role2")) { %> <br /> <ajaxToolkit:Accordion ID="AccordionProvinceManagement" runat="server" SelectedIndex="-1" HeaderCssClass="accordionHeader" HeaderSelectedCssClass="accordionHeaderSelected" ContentCssClass="accordionContent" FadeTransitions="true" FramesPerSecond="40" TransitionDuration="250" AutoSize="None" RequireOpenedPane="false" SuppressHeaderPostbacks="true"> <Panes> <ajaxToolkit:AccordionPane ID="AccordionPane13" runat="server" ContentCssClass="" HeaderCssClass=""> <Header> <a href="" class="accordionLink">Óû§¹ÜÀí</a> </Header> <Content> <asp:HyperLink ID="HyperLink15" Text="¸ü¸ÄÃÜÂë" NavigateUrl="~/AllUsers/ChangePassword.aspx" Target="_self" runat="server" EnableViewState="false" /><br /> </Content> </ajaxToolkit:AccordionPane> </Panes> </ajaxToolkit:Accordion> <% } else if (Roles.IsUserInRole("Role3 ")) { %> <br /> <ajaxToolkit:Accordion ID="AccordionCityManage" runat="server" SelectedIndex="-1" HeaderCssClass="accordionHeader" HeaderSelectedCssClass="accordionHeaderSelected" ContentCssClass="accordionContent" FadeTransitions="true" FramesPerSecond="40" TransitionDuration="250" AutoSize="None" RequireOpenedPane="false" SuppressHeaderPostbacks="true"> <Panes> <ajaxToolkit:AccordionPane ID="AccordionPane15" runat="server"> <Header> <a href="" class="accordionLink">Óû§¹ÜÀí</a></Header> <Content> <asp:HyperLink ID="HyperLink12" Text="¸ü¸ÄÃÜÂë" NavigateUrl="~/AllUsers/ChangePassword.aspx" Target="_self" runat="server" EnableViewState="false" /><br /> </Content> </ajaxToolkit:AccordionPane> </Panes> </ajaxToolkit:Accordion> <% } %> 关于回发后,绑定的数据清空的问题。 ajax asp.net GridView选中行 普通游客登录时隐藏超链接 跨站点用户管理asp.net如何实现>?速度结贴,高手进! 现在的老板怎么想的,两三个人就想在三个月内做一个进销存+财务的软件? 如何取得 页面上所有文本框的集合? 如何给按钮添加一个下拉菜单? 简单问题 求帮助 如何实现诸如http://www.csdn.net/expert/PostNew?room=33这样的链接 登录控件和webparts控件 跨站点读取cookie问题
2、如果有直接的已经写好的div之类的静态代码,你可以直接使用前台绑定,后台输出这些html组合的数据到前台,至于数据怎么生成,根据你用户的不同权限 或者 不同分类的用户 输出不同的代码到前台页面进行绑定就行了3、如果是每个页面都不一样,那么建议你写一个输出菜单类,然后根据不同的权限或者页面来进行输出,也是后台输出数据到前台绑定希望好运。
读权限的时候根据此来 加载不同的菜单
可以直接输出菜单并拼接html组合
或者借助第三方控件
Inherits="MyControl_WebUserControl" %>
<asp:TreeView ID="TreeView1" runat="server" Height="163px" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"
Width="118px">
</asp:TreeView>using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
public partial class MyControl_WebUserControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BranchInfo();
}
} /// <summary>
/// 根据ID查询机信息中的名称添加到树形父节点
/// </summary>
private void BranchInfo()
{ IList<BranchInfo> branchInfos = DHOffice.BLL.BrInfoManager.GetList(); foreach (BranchInfo branch in branchInfos)
{
TreeNode tnBranch = new TreeNode(branch.BranchName, branch.BranchId.ToString(), "", "", "main");
tnBranch.Target = "a";
tnBranch.ImageUrl = "/WebUI/Images/menuclose.gif";
this.TreeView1.Nodes.Add(tnBranch);
DepartInfo(tnBranch.ChildNodes, branch.BranchId);
}
} /// <summary>
/// 根据ID查询出信息中的名称添加到树形根节点
/// </summary>
/// <param name="tn"></param>
/// <param name="branchId"></param>
private void DepartInfo(TreeNodeCollection tn, int branchId)
{ IList<DepartInfo> departInfos = DepartInfoManager.GetList(branchId);
foreach (DepartInfo depart in departInfos)
{
TreeNode tnDepart = new TreeNode(depart.DepartName, depart.DepartId.ToString(), "", "", "main");
tnDepart.Target = "b";
tnDepart.ImageUrl = "/WebUI/Images/OpenTree.gif";
tn.Add(tnDepart);
DisplayUser(tnDepart.ChildNodes, depart.DepartId);
} } /// <summary>
/// 根据ID查询信息中的姓名添加到树形子节点
/// </summary>
/// <param name="tn"></param>
/// <param name="departId"></param>
private void DisplayUser(TreeNodeCollection tn, int departId)
{ IList<UserInfo> users = DHOffice.BLL.UserInfoManager.GetList(departId);
foreach (UserInfo user in users)
{
TreeNode tnUser = new TreeNode(user.UserName, user.UserId.ToString(), "", "", "main");
tnUser.Target = "c";
tnUser.ImageUrl = "/WebUI/Images/person.gif";
tn.Add(tnUser);
}
} /// <summary>
/// 获取节点值的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
//获取到节点的值
TreeNode node = TreeView1.SelectedNode;
//判断
if (node.Target != "c")
{
Response.Write("<script>alert('你选择不是,请重新选择');</script>");
}
else
{ //if选择的是“你选择不是,请重新选择”,else将选择人员添加 ListItem item = new ListItem();
item.Text = node.Text;
item.Value = node.Value;
ListBox listBox = this.Parent.FindControl("lstPreContractUsers") as ListBox;
listBox.Items.Add(item);
} }}这个是动态的,仅供参考
<%
if (Roles.IsUserInRole("Role1"))
{
%>
<ul class="leftmenulist">
<li>
<asp:HyperLink ID="lnkCreateUser" Text="´´½¨Óû§" NavigateUrl="~/SystemPages/CreateUser.aspx"
Target="_self" runat="server" EnableViewState="false" /></li>
<br />
<br />
</ul>
<%
}
else if (Roles.IsUserInRole("Role2"))
{
%>
<br />
<ajaxToolkit:Accordion ID="AccordionProvinceManagement" runat="server" SelectedIndex="-1"
HeaderCssClass="accordionHeader" HeaderSelectedCssClass="accordionHeaderSelected"
ContentCssClass="accordionContent" FadeTransitions="true" FramesPerSecond="40"
TransitionDuration="250" AutoSize="None" RequireOpenedPane="false" SuppressHeaderPostbacks="true">
<Panes>
<ajaxToolkit:AccordionPane ID="AccordionPane13" runat="server" ContentCssClass=""
HeaderCssClass="">
<Header>
<a href="" class="accordionLink">Óû§¹ÜÀí</a>
</Header>
<Content>
<asp:HyperLink ID="HyperLink15" Text="¸ü¸ÄÃÜÂë" NavigateUrl="~/AllUsers/ChangePassword.aspx"
Target="_self" runat="server" EnableViewState="false" /><br />
</Content>
</ajaxToolkit:AccordionPane>
</Panes>
</ajaxToolkit:Accordion>
<%
}
else if (Roles.IsUserInRole("Role3 "))
{
%>
<br />
<ajaxToolkit:Accordion ID="AccordionCityManage" runat="server" SelectedIndex="-1"
HeaderCssClass="accordionHeader" HeaderSelectedCssClass="accordionHeaderSelected"
ContentCssClass="accordionContent" FadeTransitions="true" FramesPerSecond="40"
TransitionDuration="250" AutoSize="None" RequireOpenedPane="false" SuppressHeaderPostbacks="true">
<Panes>
<ajaxToolkit:AccordionPane ID="AccordionPane15" runat="server">
<Header>
<a href="" class="accordionLink">Óû§¹ÜÀí</a></Header>
<Content>
<asp:HyperLink ID="HyperLink12" Text="¸ü¸ÄÃÜÂë" NavigateUrl="~/AllUsers/ChangePassword.aspx"
Target="_self" runat="server" EnableViewState="false" /><br />
</Content>
</ajaxToolkit:AccordionPane>
</Panes>
</ajaxToolkit:Accordion>
<%
}
%>