前言:其实在基于一些简单的系统的时候时候,很多权限都是控制到页面级别的;但是业务只要稍微复杂一点,系统就很难满足的问题,比如同一个页面需要不同的人点击不同的按钮(审批等操作)。这个时候就需要把权限放到按钮层面来控制。下面主要还是从客户端的角度来实现,具体的权限配置数据等是放到服务端的。所以假设已经获取到了用户的权限数据,并且这个数据是配置到按钮级别的。 以下通过自定义控件的方式实现,简单易用;
创建用户控件,即绘制自己的按钮,也可以直接继承自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改变事件控制,也可以从编码规范等方向规避;),同时也应考虑后端接口是否也需要根据权限对接口施加控制等
|