社区
C#
帖子详情
关于设置菜单权限的问题
acai
2003-12-08 11:41:48
常常是把不同权限的菜单列表保存到数据库里,然后根据用户来取得相应的菜单列表,然后遍历所有的菜单,把具有权限的菜单项设置为enable,以前用delphi做时,每个菜单都有个附加的tag属性,把它设置为对应菜单的自定义编号,可以用来作为一个标示符号,而数据库里保持的也是这些id,这样验证的时候方便多了,而现在在.net里,每个菜单并没有什么用来标示的属性,难道用name属性来代替??这样感觉很麻烦啊!!大家是怎么做的??
...全文
184
27
打赏
收藏
关于设置菜单权限的问题
常常是把不同权限的菜单列表保存到数据库里,然后根据用户来取得相应的菜单列表,然后遍历所有的菜单,把具有权限的菜单项设置为enable,以前用delphi做时,每个菜单都有个附加的tag属性,把它设置为对应菜单的自定义编号,可以用来作为一个标示符号,而数据库里保持的也是这些id,这样验证的时候方便多了,而现在在.net里,每个菜单并没有什么用来标示的属性,难道用name属性来代替??这样感觉很麻烦啊!!大家是怎么做的??
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
27 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wincore
2003-12-12
打赏
举报
回复
关注!
正在考虑,只不过我门是设计B/S结构的,菜单使用的是JAVASCRIPT!
acai
2003-12-12
打赏
举报
回复
结帖了,还是希望能有更好的方法。
谢谢各位的参与,谢谢brightheroes(闭关)兄弟。
acai
2003-12-09
打赏
举报
回复
to brightheroes(闭关):
你添加的事件里打开窗体,我想问的是,
Form ShowForm = (Form)info.Invoke( Portal,args );
你在这里传递了一个string类型的参数来调用窗体,如果有其他类型的参数呢??
比如: object[] args = new object[]{string1,string2,new MyClass1[],new MyClass2[]};
如果是string类型的参数,当然可以纪录在数据库里,但是其他类型的,你怎么办??
acai
2003-12-09
打赏
举报
回复
Tag属性在那里??好像没发现啊!!
haiwangstar
2003-12-09
打赏
举报
回复
.net 的菜单类中也有Tag 属性可用的。
gsuner
2003-12-09
打赏
举报
回复
第三方控件。直接用.Net里面的那个MainMenu的话,太不象产品了吧。第三方控件,什么都解决了。
8u9
2003-12-09
打赏
举报
回复
用户有个权限组,不同权限不同菜单,菜单权限和权限组对应,点击相应菜单项的时候,权限组检查有无此用户,有的话,可以操作,没有的话,弹出对话框。
brightheroes
2003-12-09
打赏
举报
回复
这样做的好处是升级方便,我就更新dll就可以了,不用动我的exe文件
brightheroes
2003-12-09
打赏
举报
回复
下面是对应的菜单事件
private void c1Command_Click(object sender, C1.Win.C1Command.ClickEventArgs e)
{
try
{
this.OpenSection ("com.uncnet.wl."+ e.CallerLink.Command .Name.ToString () ,e.CallerLink.Command .Name.ToString () , e.CallerLink.Text );
if (e.CallerLink.Text.Trim () != "-")
{
this.lblFormName .Text = e.CallerLink.Text;
}
}
catch(Exception ex)
{
uncString.ShowWarning ("该功能还没有安装!"+ex.ToString ());
}
}
#region 操作分发
/// <summary>
/// 操作分发
/// </summary>
/// <param name="inSectionNamespacePrefix">要打开模块的命名空间</param>
/// <param name="inLibraryName">要打开模块的类名</param>
/// <param name="inSectionNM">要打开模块的英文名称</param>
private void OpenSection( string nameSpace , string section , string action)
{
if (action.Trim () == "-") return ;
foreach ( Control control in this.panel1.Controls )
{
if ( control != null )
control.Dispose();
}
try
{
Type type = Type.GetType( nameSpace + ".Portal," + section );
MethodInfo info = type.GetMethod( "GetPortal" );
object Portal = Activator.CreateInstance( type );
object[] args = new object[1];
args[0] = action;
Form ShowForm = (Form)info.Invoke( Portal,args );
ShowForm.TopMost = false;
ShowForm.TopLevel = false;
ShowForm.FormBorderStyle = FormBorderStyle.None;
ShowForm.Dock = DockStyle.Fill;
this.panel1.Controls.Add( ShowForm );
ShowForm.Show ();
this.lblFormName .Text = "";
}
catch(Exception ex)
{
uncString.ShowWarning ("该功能还没有安装!"+ex.ToString ());
}
}
#endregion 操作分发
brightheroes
2003-12-09
打赏
举报
回复
这是生成菜单的,就是从数据库中读出对应的权限菜单来,放进一个datatable中,然后做循环
for( int i = 0; i < this.ds.Tables [0].Rows .Count ; i ++ )
{
if(this.ds .Tables [0].Rows [i][2].ToString () =="-1")
{
cmdLink = new C1CommandLink();
cmdMenu = new C1CommandMenu();
this.c1MainMenu1.CommandLinks.Add( cmdLink );
this.c1CommandHolder2.Commands.Add( cmdMenu );
cmdLink.Command = cmdMenu;
cmdLink.Text = this.ds.Tables [0].Rows [i][4].ToString ();
cmdMenu.Name = this.ds.Tables [0].Rows [i][1].ToString ();
cmdMenu.Text = this.ds.Tables [0].Rows [i][4].ToString ();
for( int k = 0; k < this.ds.Tables [0].Rows .Count; k ++ )
{
if ( this.ds .Tables [0].Rows [k][2].ToString () ==this.ds .Tables [0].Rows [i][0].ToString () )
{
cmdLink = new C1CommandLink();
cmd = new C1Command();
this.c1CommandHolder2.Commands.Add( cmd );
cmdLink.Command = cmd;
cmdLink.Text = this.ds.Tables [0].Rows [k][4].ToString ();
cmd.Name = this.ds.Tables [0].Rows [k][1].ToString ();
cmd.Text = this.ds.Tables [0].Rows [k][4].ToString ();
cmd.Click += new ClickEventHandler( this.c1Command_Click );
cmdMenu.CommandLinks.Add( cmdLink );
_index2 ++;
}
}
_index1 ++;
}
}
应该是用递归的,但是我们的程序没有必要,所以就没有用:)
brightheroes
2003-12-09
打赏
举报
回复
你用foreach来做不就ok了
而且,你在数据库中万一改动了什么地方,你的程序就死定了,肯定要重新写过改动的地方
acai
2003-12-09
打赏
举报
回复
自己继承MenuItem,那么有百十个菜单项的话,可够手工Add的麻烦的!!感觉还不如利用窗体设计器,利用MenuItem的name,从数据库里拉出对应权限角色的所有MenuItem的name,然后遍历整个菜单,name符合的就visable或enable,这样还来的简单方便些,而brightheroes(闭关)老兄的总觉得太累啊!难道没有更好的方法了??
acai
2003-12-09
打赏
举报
回复
up
brightheroes
2003-12-08
打赏
举报
回复
继承菜单,给它加上你想要的属性
如下
sing System;
using System.Windows.Forms;
namespace com.uncnet.wl.client
{
/// <summary>
/// 继承MenuItem类,增加Tag属性
/// </summary>
public class uncMenuItem : MenuItem
{
private object tag = "";
private string pID = "";
private string dllName = "";
private string nameSpace = "";
private string libraryName = "";
private string sectionNM = "";
public uncMenuItem( string inMenuItemText )
{
this.Text = inMenuItemText;
}
public uncMenuItem( )
{
}
/// <summary>
/// 获取或设置包含有关uncMenuItem的数据的对象
/// </summary>
public object Tag
{
get
{
return tag;
}
set
{
tag = value;
}
}
/// <summary>
/// 获取或设置菜单父ID
/// </summary>
public string PID
{
get
{
return pID;
}
set
{
this.pID = value;
}
}
/// <summary>
/// 获取或设置DLL文件名
/// </summary>
public string DllName
{
get
{
return dllName;
}
set
{
this.dllName = value;
}
}
/// <summary>
/// 获取或设置Dll的命名空间
/// </summary>
public string NameSpace
{
get
{
return this.nameSpace;
}
set
{
this.nameSpace = value;
}
}
/// <summary>
/// 模块英文名
/// </summary>
public string SectionNM
{
get
{
return this.sectionNM;
}
set
{
this.sectionNM = value;
}
}
/// <summary>
/// 程序集名称
/// </summary>
public string LibraryName
{
get
{
return this.libraryName;
}
set
{
this.libraryName = value;
}
}
}
}
py3zhsh
2003-12-08
打赏
举报
回复
up
feilong215
2003-12-08
打赏
举报
回复
幫up
brightheroes
2003-12-08
打赏
举报
回复
所以,采用反射来处理:)
一个方法就够了
acai
2003-12-08
打赏
举报
回复
动态生成好说啊,但是每个菜单的事件添加起来就太麻烦了!!
dldl
2003-12-08
打赏
举报
回复
也可以根据权限把部分菜单项灰化。连动态生成也省了。就是丑了点
甴曱
2003-12-08
打赏
举报
回复
菜单的动态生成:1、使用XML,把你的菜单项存放在XML文件中,然后通过与之相关的权限生成菜单。
2、使用数据库,与XML的原理一样:)
加载更多回复(7)
ASP.NET通用
权限
管理系统源代码(含文档、数据库)
ASP.NET通用
权限
管理系统源代码(含文档、数据库) 1.
菜单
导航管理 2.操作按钮 3.角色管理 4.部门管理 5.用户管理(用户
权限
) 6.用户组管理(
设置
成员,用户组
权限
) ...15.系统个性化
设置
(切换
菜单
导航)
Ruoyi | 用户
菜单
权限
详解
1)为用户ry
设置
为普通角色后续会对ry用户进行
权限
测试2)添加
菜单
按钮并
设置
权限
字符3)为普通角色
设置
菜单
权限
,仅可以访问
权限
测试这个
菜单
按钮4)编写相应的前后端代码后端相应
权限
测试的接口前端按钮UI显示API5...
vue实现
菜单
的
权限
设置
在Vue应用程序中,可以使用路由守卫(route guard)来控制用户的访问
权限
,从而实现
菜单
权限
设置
。以下是一个简单的实现方法:
vue项目
权限
:数据
权限
、
菜单
权限
、按钮
权限
如果按照类型划分,大概可分为三类:
菜单
权限
、按钮
权限
、数据
权限
;数据
权限
:前端在请求头统一封装,携带用户信息,由后端解析返回;
菜单
权限
:通过element
菜单
组件实现;按钮
权限
:通过自定义指令实现;
菜单
权限
&...
vue
权限
管理——
菜单
权限
设置
1.前提:后端提供
菜单
对应数据 此处用mockjs模拟 const menuList = [ {'id': ...
问题
:如果刷新后
菜单
栏消失 就是
菜单
数据没有
设置
到本地sessionStorage中 5.退出登录后需要清空sessionStorage sessionStorage.clear();
C#
111,094
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章