前言:其实在基于一些简单的系统的时候时候,很多权限都是控制到页面级别的;但是业务只要稍微复杂一点,系统就很难满足的问题,比如同一个页面需要不同的人点击不同的按钮(审批等操作)。这个时候就需要把权限放到按钮层面来控制。下面主要还是从客户端的角度来实现,具体的权限配置数据等是放到服务端的。所以假设已经获取到了用户的权限数据,并且这个数据是配置到按钮级别的。.
以下通过自定义控件的方式实现,简单易用;
-
创建用户控件,即绘制自己的按钮,也可以直接继承自Button,但是如果需要美观一点,比如要做圆角等,还是需要自己绘制。
-
在系统内所有需要控制权限的按钮采用此控件(除了登录页,基本都用就行了)。
-
后台需要配置的数据格式:
namespace.form.button
,即页面的命名空间+页面的名称+按钮的名称 -
重写
OnLoad
事件,在此事件中对按钮禁用或者启用
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (GlobalData.UserButtons != null)
{
Control form = Parent;
for (int i = 0; i < 10; i++)
{
if (form == null) return;
if (form is BaseForm)
{
break;
}
else
{
form = form.Parent;
}
}
string btnName = form.GetType().FullName + "." + Name;
if (ignoreBtnText.Contains(BtnText) || GlobalData.UserButtons.Exists(s => s.Path == btnName))
{
Visible = true;
}
else
{
Visible = false;
}
}
}
-
以上
GlobalData.UserButtons
就是系统登录后,存储的用户的按钮权限数据,这里是只有配置了才会对按钮进行显示,否则进行隐藏(也可以设置禁用等属性)。 -
以上是简单的实现方式,深层次还应该屏蔽代码中的
Visible
属性设置(比如万一在代码中又对这个按钮进行了启用,可以用Visible改变事件控制,也可以从编码规范等方向规避;),同时也应考虑后端接口是否也需要根据权限对接口施加控制等