就用一个简单的网页来说吧。一个页面里有若干个控件(按钮),针对不同的操作,而我要做一个授权机制来控制按钮的显示或是否可用,对于不同类型的用户,给予不同的权限。我是想通过获取页面中所有控件的名称来进行控制,但要如何获取所有控件(控件名)呢?
不要使用 FindControl 的解决思路,递归寻找的效率、性能将是大问题,极其不实用。
以下引用于我的回答(http://space.cnblogs.com/question/2780/):
你说的应该是指如果对用户进行权限管理。就我的经历来看,分两类:一类精确到页,一类精确到控件(页面区域?)。
对于前者,我的做法是,创建 ResourcesManager 类,其负责或返回当前用户针对某页是否可访问。数据库创建 Resources 表,记录用户(建议使用用户组或角色)和已授权页的匹配关系。
后者,创建 ControlsManager 类,而数据库端创建 Controls 表,记录用户(建议使用用户组或角色)和已授权控件的匹配关系。而在页面加载时,各控件(也可以是页的某个区域)根据授权选择显示或不显示。
...
当前楼主特指控件授权的情形。我的做法是,给控件(Control)的某个属性赋予特殊涵义,比如 ID,并订阅控件 Control_Load 事件如下情形:
ControlsManager
protected void Control_Load(object sender, EventArgs e) {
ControlsManager.CheckAuth(sender as Control);
}
public class ControlsManager {
public static void CheckAuth(Control c) {
string controlName = c.ID.Substring(c.ID.IndexOf('_') + 1);
//从数据库表 Controls 及 UserControls 中获取当前用户与 controlName 的授权匹配情形
……
c.Visible = true;//通过验证
c.Visible = false;//验证失败
}
}
注意数据库表 Controls 含字段 ControlId, ControlName,表 UserControls 含 UserId, ControlId等
单纯的获取所有控件,可以使用FindControl()方法,不过你这个规则很难定义吧?
我以前做过一个类似的,是给所有需要进行权限控制的控件一个GUID,权限分配时根据这个GUID来分配,操作起来相当麻烦,需要把权限下放到这些控件,管理后台设置是一件相当头疼的事情
你这个是怎么做的?
有个LoginView控件可以实现这样的功能啊,可以根据不同的角色显示不同的模板
我这种操作归纳到权限管理中的资源管理
如 添加人员权限[其实就是一个添加人员的页面],而对应有好多资源[如添加,删除,修改],其资源的ID,和页面上的ID是一对一的对应关系,如添加页面中的资源添加ID是add,那页面中添加按钮的ID就是btn_add,这样,当分配了一个角色的权限中,其添加人员权限中,有资源:添加的话,那就显示btn_add
以上是大概的思路,设计时还要具体对待