关于设置菜单权限的问题

acai 2003-12-08 11:41:48
常常是把不同权限的菜单列表保存到数据库里,然后根据用户来取得相应的菜单列表,然后遍历所有的菜单,把具有权限的菜单项设置为enable,以前用delphi做时,每个菜单都有个附加的tag属性,把它设置为对应菜单的自定义编号,可以用来作为一个标示符号,而数据库里保持的也是这些id,这样验证的时候方便多了,而现在在.net里,每个菜单并没有什么用来标示的属性,难道用name属性来代替??这样感觉很麻烦啊!!大家是怎么做的??
...全文
166 27 打赏 收藏 转发到动态 举报
写回复
用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)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧