社区
C#
帖子详情
关于设置菜单权限的问题
acai
2003-12-08 11:41:48
常常是把不同权限的菜单列表保存到数据库里,然后根据用户来取得相应的菜单列表,然后遍历所有的菜单,把具有权限的菜单项设置为enable,以前用delphi做时,每个菜单都有个附加的tag属性,把它设置为对应菜单的自定义编号,可以用来作为一个标示符号,而数据库里保持的也是这些id,这样验证的时候方便多了,而现在在.net里,每个菜单并没有什么用来标示的属性,难道用name属性来代替??这样感觉很麻烦啊!!大家是怎么做的??
...全文
246
27
打赏
收藏
关于设置菜单权限的问题
常常是把不同权限的菜单列表保存到数据库里,然后根据用户来取得相应的菜单列表,然后遍历所有的菜单,把具有权限的菜单项设置为enable,以前用delphi做时,每个菜单都有个附加的tag属性,把它设置为对应菜单的自定义编号,可以用来作为一个标示符号,而数据库里保持的也是这些id,这样验证的时候方便多了,而现在在.net里,每个菜单并没有什么用来标示的属性,难道用name属性来代替??这样感觉很麻烦啊!!大家是怎么做的??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
jeecg删除
菜单
导致角色
权限
设置
点不开的
问题
解决
本文介绍了在JEECG 3.7.1版本中如何处理
菜单
删除后遗留的角色
权限
问题
,并提供了一条SQL语句来清理未被完全删除的角色对应目录表数据。
Mac Media Key Forwarder常见
问题
解决:从
权限
设置
到
菜单
图标隐藏全攻略
本文详解Mac Media Key Forwarder核心配置:包括辅助功能与自动化
权限
设置
,确保媒体键可正常控制iTunes和Spotify;提供
菜单
栏图标隐藏/恢复方法;支持应用优先级设定(iTunes/Spotify/双控)及无播放器时自动暂停功能。适用于macOS平台的媒体快捷键管理场景。
odoo13中下拉
菜单
不能同时显示的
权限
问题
。
本文探讨了在Odoo的openacademy示例中遇到的模块
菜单
显示
问题
,特别是在同一代码文件中定义的两个不同模块仅显示一个下拉
菜单
的情况。通过调整
权限
设置
,即开放两个模块间的操作
权限
,成功解决了
菜单
显示不全的
问题
。
织梦dede后台左侧
菜单
空白不显示解决办法(织梦进入后台发现左侧
菜单
不可用)
这篇博客分享了解决织梦内容管理系统(dedeCMS)后台左侧
菜单
不显示的
问题
。作者指出,该
问题
并非数据库故障,而是
权限
设置
不当。通过将/data/tplcache/目录
权限
设置
为777,可以成功修复
菜单
空白的
问题
,简单刷新后左侧
菜单
即可恢复正常显示。
laravel-admin-仅显示自己
权限
菜单
-隐藏无
权限
菜单
本文详细介绍了在 Laravel Admin 中如何配置
权限
、角色及
菜单
控制,解释了
权限
设置
常见
问题
,并分享了如何利用 auth.setting
权限
实现会员自我信息管理。
C#
111,132
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章