有了吉日大师的源码也差不多一年之久,从v3.5 到v3.7已有三个版本,v3.5中的好多丑陋代码到v3.7已经有很大的优化,代码层次也分了很清楚,对我们这些菜鸟学习来说绝对有很大的提高,由于杂事多多,没有自己研究里面的代码,但粗糙看了一遍后,发现里面好多功能还有很多不足之处,从按钮权限说起。
通用权限系统按钮权限控制是在后台写死的,有什么按钮,就在后台根据登陆的用户名判断是否有其权限,代码如下:
this.permissionAccess = this.IsModuleAuthorized("StaffAdmin"); // 访问权限
this.permissionAdd = this.IsAuthorized("StaffAdmin.Add"); // 新增权限
this.permissionEdit = this.IsAuthorized("StaffAdmin.Edit"); // 编辑权限
this.permissionDelete = this.IsAuthorized("StaffAdmin.Delete"); // 删除权限
this.permissionExport = this.IsAuthorized("StaffAdmin.Export"); // 导出权限
IsModuleAuthorized(”StaffAdmin”)是继承窗体的一个方法,每个窗体都继承这个基窗体,参数是权限名,从而窗体一行代码很容易就判断该用户是否有相应的按钮权限,看似很简单,但如果页面新增了按钮或删除了按钮,如果有很多按钮又如何控制……..?每次修改后台代码虽然不是很繁琐。但也让人不爽。
如何更好的改进按钮权限,我目前想到的是对按钮进行封装,按钮是否能用,只和用户有关系,如果用户有控制按钮的权限enable=true否则就是enable=false,和页面没有关系。
以b/s 模式的 button 控件为例,来讨论如何将按钮和用户权限控制起来。
普通的button控件,不能满足我们的要求,所以我们要实现一个PermissionButton控件,该控件继承button ,我们可以在OnPreRender事件中判断按钮是否可用。效果如下。
[ToolboxData("<{0}:PermissionButton runat=\"server\" Text=\"权限按钮\"></{0}:PermissionButton>")]
public class PermissionButton:Button
{
protected override void OnPreRender(EventArgs e)
{
if (!CheckPermission())
{
this.Enabled = false;
}
Else
{
this.Enabled = true;;
}
base.OnPreRender(e);
}
public bool CheckPermission()
{
if (PContext.Current.User.IsSuperAdmin || (!string.IsNullOrEmpty(this.m_OperationCode) &&PContext.Current.User.HasPermission (this.m_OperationCode)))
{
return true;
}
return false;
}
}
说明:m_OperationCode 作为按钮的权限属性,如:M_OperationCode=“StaffAdmin”
现在我们只需用PermissionButton 就可以了。后台不用在做判断了。