以前用ASP.NET1.1做过一个系统,要求根据用户的权限来动态生成导航菜单。当时的做法是将页面的信息保存在数据库里,然后新建一张表,用来关联<角色表>和<页面表>(实际情况是<用户表>和<页面表>也关联起来了),这个表里表示<角色>和<页面>的关系字段有三个值,0表示拒绝,1表示可读,2表示读写。这样每次加载菜单的时候,需要根据<角色>或<用户>去表里读去所有页面的可读状态,然后动态生成菜单。并且每个页面加载前都要判断用户的权限。
而在ASP.NET2.0里,通过Web.sitemap和TreeView(或Menu)的配合加上Role和User的配置可以很简洁的完成上面的功能,除了配置外无需任何代码。
现在有一个新的需求,需要除了完成以上功能外,还要允许用户自定义菜单。即用户可根据自己的喜好,在权限允许的范围内定义显示某些菜单。下面用图来更详细的描叙需求(导航使用的TreeView作为菜单):
上图表示整站的所有菜单,也就是管理员可看到的菜单。
现在提供一个用户自定义菜单的页(这个图是普通用户看到的,即普通用户对类别C及C下的页面无访问权限,这个可以通过配置完成):
用户如果将<类B功能2>节点前的勾取消并保存的话,那么他应该看到的界面为:
同样他也可以再将刚才去掉的节点通过这个界面添加到导航菜单里。
查了一下,没有发现ASP.NET2.0有这方面的捷径。
那么想用以前1.1的方法来实现,即还是将页面的信息保存在数据库里,并与<用户表>关联,然后加载的时候先去数据库取值判断是否在菜单里显示该节点和在选择菜单里是否勾选该节点。
问题:
一 2.0里的导航菜单项来自于Web.sitemap,一个XML文件。如果再在数据库里建这样一张表,以后维护的时候就需要考虑同步的问题,显然是很不方便的。
二 而且如何在代码里实现是否加载某个节点,也是个问题。菜单的绑定都是通过配置完成的,它直接和Web.sitemap文件关联,按照上面的想法,就需要先去数据库取节点对应的用户权限字段的值,然后根据这个值来判断菜单的节点是否需要显示(或加载),如果不需要显示应该如何控制?(比如从数据库读出来当前用户已经将<类B功能2>节点去掉了,那么在加载菜单的时候该如何控制?)
如果有做过类似系统的朋友或有思路的朋友,请不吝赐教!有什么地方我说的不清楚的话请留言。