社区
C#
帖子详情
关于设置菜单权限的问题
acai
2003-12-08 11:41:48
常常是把不同权限的菜单列表保存到数据库里,然后根据用户来取得相应的菜单列表,然后遍历所有的菜单,把具有权限的菜单项设置为enable,以前用delphi做时,每个菜单都有个附加的tag属性,把它设置为对应菜单的自定义编号,可以用来作为一个标示符号,而数据库里保持的也是这些id,这样验证的时候方便多了,而现在在.net里,每个菜单并没有什么用来标示的属性,难道用name属性来代替??这样感觉很麻烦啊!!大家是怎么做的??
...全文
166
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)
ASP.NET通用
权限
管理系统源代码(含文档、数据库)
ASP.NET通用
权限
管理系统源代码(含文档、数据库) 1.
菜单
导航管理 2.操作按钮 3.角色管理 4.部门管理 5.用户管理(用户
权限
) 6.用户组管理(
设置
成员,用户组
权限
) 7.系统配置(动态配置系统参数) 8.附加属性(自定义属性) 9.系统日志(异常记录) 10.数据库备份/还原 11.资源管理,(动态数据库) 12.个人信息(基本信息,附加信息,用户角色,拥有
权限
) 13.首页快捷 14.数据回收站(业务功能删除过数据,全部保留在回收站) 15.系统个性化
设置
(切换
菜单
导航)
vue实现
菜单
的
权限
设置
在Vue应用程序中,可以使用路由守卫(route guard)来控制用户的访问
权限
,从而实现
菜单
权限
设置
。以下是一个简单的实现方法:
vue项目
权限
:数据
权限
、
菜单
权限
、按钮
权限
不管是移动端,还是pc端,可能都会有用户登录操作,不同的用户之间又拥有不同的角色,而不同角色之间势必存在不同的
权限
;如果按照类型划分,大概可分为三类:
菜单
权限
、按钮
权限
、数据
权限
;数据
权限
:前端在请求头统一封装,携带用户信息,由后端解析返回;
菜单
权限
:通过element
菜单
组件实现;按钮
权限
:通过自定义指令实现;
菜单
权限
&按钮
权限
:本质上也是通过数据
权限
,由后端返回当前用户所有有
权限
菜单
及按钮,然后由前端处理;} }
Ant Design Pro内容和
菜单
权限
设置
**讲真的关于Ant Design Pro2.0以上版本的资料在网上就很少了,对于小编这样的小白学起来真的很吃力,由于公司有个项目用这个框架做的,所以又不得不学。** 提出的需求是
权限
管理,具体是不同用户在登录后拥有不同的
菜单
和内容。 说实话小编刚实习,项目就没接触几个,作为一名光荣的前端对于这个
权限
这个就接触的更少了,之前只用php做过
权限
,不过那是连接的数据库有明确的用户
权限
等级属性,...
Vue 项目
菜单
权限
及按钮级
权限
控制
实现思路 1.页面展示需要鉴权的所有按钮,需要先鉴权
菜单
权限
的显示与隐藏。 2.勾选每个角色或者用户所能看的
权限
保存在数据库。该
权限
数据是一个
权限
字段的数组。 3.全局自定义指令(directive)控制按钮
权限
数据的方法,登入时获取后端传来的按钮
权限
数组。 4.在每个按钮中调用该指令,并传入该操作的
权限
字段和后端保存的
权限
字段进行匹配,能匹配则该操作按钮可显示 具体代码如下 获取登录用户所有
权限
// 获取
权限
菜单
(存在store下modules下user.js的actions中) getMenuT
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章