通用权限系统设计——第六章
这章紧接着第五章的内容,如果你没有看过第五章的内容,请看一下第五章所说的,因为这章跟第五章的内容联系非常紧密。
第六章主要讲解一个控件,也就是submit控件,其它控件这里我们就不做详细的介绍了,基本同理,思路都一样的。
第五章我们得到了用户所属模块的权限,这一步至关重要,也是这权限控件的灵魂。
现在进入今天的主题,添加一个类,命名为:PDButton,PD是我自己加的前缀,与C#中的button区分开来。添加完整这个类之后,总所周知,这个类得继承:System.Web.UI.Contorl和System.Web.UI.IPostBackEventHandler,然后我们在PermissionEnum枚举类中再加上一个枚举,代码如下:
public enum PermissionEnum { … /// <summary> /// 没有任何权限 /// </summary> NoAuthority }
这里的用处是什么了?这里就是确保每个按钮在没有添加权限的情况下面,都让他保存没有任何权限,这个枚举是数据库中没有的,这里只是为了程序而声名的。主要用处是在没有添加权限属性的情况下,让这个按钮保持不能操作的状态,是为了防止出现数据上面的问题而特意做的这项工作。
加完这个枚举之后,我们在PDButton按钮中自定义一个属性,定义的属性代码如下:
private virtual PermissionEnum _permissions = PermissionEnum.NoAuthority; /// <summary> /// 权限属性 /// </summary> [ Bindable(true), Category("Appearance"), DefaultValue(PermissionEnum.NoAuthority), Description("无任何权限"), Localizable(true), ] public virtual PermissionEnum Permissions { get { return this._permissions; } set { this._permissions = value; } }
还得继续定义一个属性,要不然,没法给这个控件Text属性值,所以这个我们还是比较加上的,具体代码如下:
/// <summary> /// 按钮中的Text 属性 /// </summary> public virtual string Text { get; set; }
定义的类型就是声明的枚举,定义完成这个属性之后,我们还要为这个按钮追加按钮事件。
不管怎么样,处理事件,我们第一个想到了委托,委托多方便啊,全全交由其他人完成,减少我们多少的工作量啊!
首先,我们先声明一个委托,代码如下:
public event EventHandler Click;
我们自己在声明一个方法,作为自定义按钮的点击事件,为了方便,我将方法命名为:OnClick,这个名称可以随便取名,只是在这里,我们为了统一和asp.net一致。
下面给出具体代码:
/// <summary> /// 点击事件 /// </summary> /// <param name="e"></param> public virtual void OnClick(EventArgs e) { if (this.Click != null) { this.Click(this, e); } }
做到这里,这个按钮事件也快差不多结束了,记住,是差不多结束,并没有真正的结束掉,要想结束,其实也不难。我们这个类是不是继承了System.Web.UI.IPostBackEventHandler,我们只是继承了它,但是我们并没有实现接口里面的方法,这样是会报错的。所以下一步,我们是实现System.Web.UI.IPostBackEventHandler接口里面的方面。
代码很简单,如下:
/// <summary> /// 处理回发事件 /// </summary> /// <param name="eventArgument"></param> public void RaisePostBackEvent(string eventArgument) { this.OnClick(EventArgs.Empty); }
到这里,我们就可以编写RenderControl里面的内容了,里面的内容,我做最简单的来完成吧,为了节省时间。
首先,也是总所周知的,这里是呈现html控件的地方(这里我就说的通俗一点),这里我们要做的是一个submit按钮,在网页上面看到的submit按钮完整的html是这样的:
<input id=" Button" type="submit" value=" submit " name=" submit ">
这个是一个最简单的submit按钮,我们要呈现的方式也是这种,只是稍加改进一下,现在做的,我先不加权限控制,先把这个按钮呈现到页面上。
具体代码如下:
public override void RenderControl(HtmlTextWriter writer) { base.RenderControl(writer); StringBuilder sb = new StringBuilder(); sb.AppendFormat("<input type='submit' id='{0}' name='{1}' value='{2}' />", this.ClientID, this.UniqueID,this.Text); writer.Write(sb.ToString()); }
ClintID和UniqueID不知道的话,或者为什么这样,你自己去查找资料吧,这里不想说了,比较简单。
做完这一切,我们编译一下,工具箱中将会出现我们这个按钮,如下图:
如果这里没有出现这个,你得打开一个aspx网页,然后切换到设计方式,这样才可能出现到这个工具箱来
好了,我们将这个控件直接拖到UserList.aspx页面上,在页面上面的代码是这样的,如下:
<cc1:PDButton ID="PDButton1" Text="测试用的权限控件" runat="server" />
现在我们运行网站,来看看效果吧!
由于这个控件没有加上还没有加是权限控制,所以,这个和普通的submit控件没有什么两样,下一步,我们就把他的权限加上。
我这里先做第一种,有这个权限,则隐藏这个按钮。
加上权限验证,其实也很简单,为什么了?因为我们第五章也就吧该做的都做好了,现在就只管拿来用了。代码如下:
public override void RenderControl(HtmlTextWriter writer) { base.RenderControl(writer); //GetPermission就是我们第五章所写的代码,现在就只有用到这句代码就已经足够了 Visible = ValidataPermission.GetPermission(this.Permissions); if (!Visible) return; StringBuilder sb = new StringBuilder(); sb.AppendFormat("<input type='submit' id='{0}' name='{1}' value='{2}' />", this.ClientID, this.UniqueID,this.Text); writer.Write(sb.ToString()); }
代码没有增加多少,就添加了三行代码,添加完整这三行代码还不够,aspx页面上用到的这个控件,我们起初自定义了一个属性为:Permissions,现在轮到他出场了。
从图上可以看出,当我们添加Permissions属性之后,他会自动出现枚举中的几个选项,当我们这个按钮属于哪一个权限的时候,我就是Permissions选择哪个值,到目前为止,我们用户中这几个选项都用,所以,我们先选择NoAuthority,使他没有任何权限,然后我们在刷新网页,结果如下:
设置完成这个属性后,页面什么都没有显示了。
现在我们重新设置一下,选择:Add 进行测试,因为这个用户是具有添加权限的。如果用户对应的权限,你不清楚,你可以去《第三章》进行了解一下。下面直接上图:
<cc1:PDButton ID="PDButton1" Text="测试添加权限" Permissions="Add" runat="server" />
是不是按钮出现了?现在这个按钮非常方便了吧,不用你怎么去设置什么东西了,用起来非常的简单。
由于我还没有做到角色管理那块,不能从页面上直接分配权限,现在我只能到数据库中新添加一个用户,重新添加一个角色,是这个角色只有浏览,编辑权限。下面是我在数据中,直接加的用户,如下图:
用户admin4是我手动添加的用户,从上图,大家应该都很明了的看出这个用户具有的权限吧,好,现在我们以“用户列表”模块作为测试点,admin4用户在用户列表页面只具备两个权限:浏览和修改,现在我们在这个页面上面,分别把 增删改查的权限一并放下去,aspx页面上的代码如下:
<cc1:PDButton ID="btnAdd" Text="测试添加权限" Permissions="Add" runat="server" /> <cc1:PDButton ID="btnDelete" Text="测试删除权限" Permissions="Delete" runat="server" /> <cc1:PDButton ID="btnEdit" Text="测试编辑权限" Permissions="Edit" runat="server" /> <cc1:PDButton ID="btnBrowse" Text="测试浏览权限" Permissions="Browse" runat="server" />
然后浏览页面,看看效果如何:
上图是admin4登录的,我们在看看admin登录的效果,请看下图:
其实的确很简单,大家看完之后,看见基本没有什么难度吧!
今天就到这里把,不好意思啊,第五章说好到这章,将放出源码,但是我认为现在的源码大家拿来没用,所以放出源码时间有变了,抱歉!