不知不觉本系统写了快三个月了,最近写页面的具体功能时感觉到有点吃力,很多地方如果张嘴来讲的话可以说得很细,很全面,可写成文字的话,就不太会写了,有些地方想讲得清晰的话,得用多几倍的文字+实例+变化中的图片才能表达得清楚,而写这些又太费时间了,近段时间又特忙,所以只能是尽力而为,希望大家自行研究,如果有什么地方不明白的,发发评论或邮件给我,我再重新详细讲解。
说回正题,对于页面访问权限以及每个按键的权限控制,很久以前用过好几种不同的方法,比如为每个控件分配名称或编码,然后在写代码时绑定这些值,又比如用XML来配置制权限等方法。这些方法都比较麻烦,而且由于都是使用编码方法,开发时需要一个个进行绑定,容易出错。经过后来不断的完善,最后完成了本系统所采用的页面控件注册管理来绑定控件权限(如有雷同,纯属巧合,哈哈...),首先创建菜单,并绑定好对应的文件(页面),然后将系统要用到的名称添加到公用标识库中,跟着在页面控件权限管理页面对各个页面控件进行绑定(只需要点击鼠标即可),通过职位(角色)来赋于不同的操作权限,只需要设置好管理员的职位,那么该管理员就拥有他所绑定的角色的全部权限了。
如下面的说明
首先在后端注册菜单(菜单绑定页面)
创建公用页面权限标识,待用
为需要绑定页面控件权限的菜单页面绑定操作控件(左列为上图录入的公共控件名称,右列为已绑定的页面控件,只需要点击鼠标就可以轻松绑定)
创建好部门
在不同部门创建相应的职位(角色)
为不同角色设置菜单与页面控件操作权限
开发说明:(主要讲讲与上一章中不同的内容)
1、PagePowerSignPublicList.aspx.cs 公用页面控件权限标识列表管理文件
这个页面是比较经典的普通列表页面,比较代码,有以下一些地方和菜单页面不一样的
1 #region 加载数据 2 /// <summary>读取数据</summary> 3 public override void LoadData() 4 { 5 //设置排序 6 if (sortList == null) 7 { 8 Sort(null); 9 } 10 11 //绑定Grid表格 12 bll.BindGrid(Grid1, Grid1.PageIndex + 1, Grid1.PageSize, null, sortList); 13 } 14 15 #endregion
对于排序函数的调用,菜单页面是有层次感列表,所以要自定义排序函数,而对于正常的列表,我们直接调用父类的Sort(null)函数即可
绑定Grid表格也与菜单页面调用的不一样,bll.BindGrid()函数使用的是参数中需要添加当前在第几页,每个页面显示多少行,null是条件参数,后面会详细解释它怎么使用,最后一个参数是排序规则参数
另外,Delete()删除函数也使用批量删除功能,不过会在删除前进行检查,发现指定记录不能删除时,则弹出提示是那个Id的记录无法删除,大家自行比较一下两个列表文件就明白了。
2、PagePowerSignPublicEdit.aspx.cs公用页面控件权限标识编辑文件
这个文件要注意的地方是Save()函数
1 #region 保存 2 /// <summary> 3 /// 数据保存 4 /// </summary> 5 /// <returns></returns> 6 public override string Save() 7 { 8 string result = string.Empty; 9 int id = ConvertHelper.Cint0(hidId.Text); 10 11 try 12 { 13 #region 数据验证 14 15 if (string.IsNullOrEmpty(txtCName.Text.Trim())) 16 { 17 return txtCName.Label + "不能为空!"; 18 } 19 var sName = StringHelper.Left(txtCName.Text, 20); 20 if (PagePowerSignPublicBll.GetInstence().Exist(x => x.CName == sName && x.Id != id)) 21 { 22 return txtCName.Label + "已存在!请重新输入!"; 23 } 24 if (string.IsNullOrEmpty(txtEName.Text.Trim())) 25 { 26 return txtEName.Label + "不能为空!"; 27 } 28 var sEname = StringHelper.Left(txtEName.Text, 50); 29 if (PagePowerSignPublicBll.GetInstence().Exist(x => x.EName == sEname && x.Id != id)) 30 { 31 return txtEName.Label + "已存在!请重新输入!"; 32 } 33 34 #endregion 35 36 #region 赋值 37 //定义是否更新标识——即当前记录的名称是否改变了 38 bool isUpdate = false; 39 40 //获取实体 41 var model = new PagePowerSignPublic(x => x.Id == id); 42 43 //判断是否有改变名称 44 if (id > 0 && (sName != model.CName || sEname != model.EName)) 45 { 46 isUpdate = true; 47 } 48 49 //设置名称 50 model.CName = sName; 51 //设置英文名称 52 model.EName = sEname; 53 #endregion 54 55 //---------------------------------------------------------- 56 //存储到数据库 57 PagePowerSignPublicBll.GetInstence().Save(this, model); 58 59 //判断是否需要同步更新关联表字段 60 if (isUpdate) 61 { 62 //调用更新函数,同步更新对应的所有记录 63 PagePowerSignBll.GetInstence().UpdateValue_For_PagePowerSignPublic_Id(this, model.Id, PagePowerSignTable.CName, model.CName, PagePowerSignTable.EName, model.EName); 64 } 65 } 66 catch (Exception e) 67 { 68 result = "保存失败!"; 69 70 //出现异常,保存出错日志信息 71 CommonBll.WriteLog(result, e); 72 } 73 74 return result; 75 } 76 #endregion