【自然框架】 页面里的父类——把共用的东东都交给父类,让子类专注于其他。

 

【类图】

【命名空间】——————————————————【文件截图】

   

可能您会问,不就是弄个父类吗,怎么又是这么复杂呢?这个嘛,听我慢慢道来。

(类图里面Tree、Main1、DataDelete1、DataForm1、DataList1不是父类,而是共用页面)

      这个是依据自然框架的特点来设置的,目的就是把共用的代码都放到父类里面,减轻子类的代码量。就是最大限度的避免冗余代码,就是说相同的代码只出现在一处!

      如果只设置一个父类,不能满足不同的需求,所以就根据不同的需求,设置了多级的父类。

1、 BasePage 。 public class BasePage : System.Web.UI.Page {}
      这个就是为了定义数据访问函数库的实例,用于访问数据库。在OnUnload的时候进行一下收尾工作。
      我的想法就是,一个用户在一次访问周期里,只使用一个访问数据库的实例。特殊情况除外。因为我自己写的数据访问函数库不是静态函数的,使用前必须先new一下,而每次用的时候都要new比较麻烦,所以就放在父类里面了。


2、 PagePermission
。 public class PagePermission : BasePage
      这里是做权限验证用的,首先要验证用户是否登录,如果没有登录那还谈什么权限呀。然后是两个函数,一个是验证当前用户是否可以访问指定的FunctionID(功能节点ID),另一个是验证当前用户是否可以访问指定的ButtonID(功能按钮ID)。这两个函数并不是在这里被调用,而是给子类准备的。

3、  PageURL。public class PageURL : PagePermission
      这里面要处理URL传递过来的参数。在自然框架里面大部分页面都要传递FunctionID,表单页面都要传递ButtonID、DataID,一些页面还需要传递ForeignID(外键)、DepartmentID(部门ID)。URL传递过来的,那么首先就要先接收下来,然后要进行验证以避免SQL注入攻击。
这些工作就要在这里完成了。

(再往下就有分支了)

4、  BasePageList。 public partial class BasePageList : PageURL
      数据列表页的基类。这里要定义分页控件、查询控件、查询按钮、按钮组控件、数据显示控件,在OnInit里面调用父类函数验证是否有权限访问,然后给这些控件的属性赋值(依据元数据来赋值)、设置关联关系。

5、  BasePageForm。public partial class BasePageForm : PageURL 
      表单页面的基类。这里要定义表单控件、保存按钮等。
      在OnInit里面首先验证DataID,再调用父类函数验证是否有权限访问,再验证是否可以访问指定的记录(DataID),然后给这些控件的属性赋值(依据元数据来赋值)、设置关联关系。给保存按钮定义事件。
      在OnLoad里面设置表单的状态:添加、修改、查看等。

6、  BasePageDelete。public class BasePageDelete : PageURL
      删除数据的基类。
      在OnInit里面首先验证DataID,再调用父类函数验证是否有权限访问,再验证是否可以访问指定的记录(DataID)。

下面介绍公用页面
1、 DataList1、DataList1.aspx。public partial class DataList1 : Base.BasePageList  
      数据列表的共用页面。由于自然框架采用了“自定义控件+元数据”的方式,所以90%以上的列表页面都可以由这个页面来实现,上次视频演示的Demo里面,角色的列表、新闻维护、新闻分类的列表都是 DataList1.aspx。
由于大部分代码都放在了基类里面,所以这里主要是做页面布局,.aspx.cs里面只需要写几行代码即可。

2、  DataForm1、DataForm1.aspx。public partial class DataForm1 : Base.BasePageForm 
      表单的共用页面。由于自然框架采用了“自定义控件+元数据”的方式,所以20%以上的表单页面都可以由这个页面来实现,上次视频演示的Demo里面,添加新闻、添加分类的表单都是DataForm1.aspx。


3、 DataDelete1、DataDelete1.aspx
。public partial class DataDelete1 : Base.BasePageDelete   
      删除数据的共用页面。删除数据是一件很复杂的事情,一个页面是不可能搞定的,这个页面只是实现最最简单的删除的功能,其他复杂的就需要单独写代码实现了。

总结:URL参数的验证、权限的验证、访问记录的验证、控件属性赋值等,都交给父类去做,子类就可以不用去考虑权限的问题,专心致志的处理好自己的业务逻辑了。这样程序员就可以说:我是写代码的(实现具体功能),权限管我p事。

      对了,还有一点忘记说了,这是一个独立的、单独的项目,他编译后会生成 Nature.BaseUI.dll 文件,然后在做新的的项目的时候可以引用这个dll文件,然后在把其他的.aspx文件拷贝到项目的指定的文件夹里面。注意只是拷贝文件,不用添加到新的项目里。

附:BasePageList  的代码。如果您感兴趣的话,可以到这里下载全部代码。http://www.cnblogs.com/jyk/archive/2009/09/09/1563269.html

namespace Nature.UI.Base
{
    /**//// <summary>
    /// 列表页面的基类
    /// 这个算不算模板模式呢?
    /// </summary>
    public partial class BasePageList : PageURL
    {
        定义共用的控件,以便于统一控制#region 定义共用的控件,以便于统一控制
        /**//// <summary>
        /// 分页用的控件
        /// </summary>
        public QuickPager ctl_CommonPager;

        /**//// <summary>
        /// 显示数据用的控件
        /// </summary>
        public MyGrid ctl_CommonGrid;

        /**//// <summary>
        /// 查询控件
        /// </summary>
        public MyFind ctl_CommonFind;

        /**//// <summary>
        /// 查询按钮
        /// </summary>
        public Button Btn_Search;

        /**//// <summary>
        /// 按钮组,功能(操作)按钮
        /// </summary>
        public OperationButtonBar ctl_CommonButtonBar;

        #endregion

        /**//// <summary>
        /// 在 OnInit 事件里面设置各个自定义控件的属性和关联
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            //调用父类函数,验证是否有权限访问。
            CheckFunctionID(this.FunctionID);

            //设置分页控件的属性和事件
            SetQuickPagerInfo();

            //设置数据表格的属性
            SetGridInfo();

            //设置查询控件的属性
            SetFindControlInfo();

            //设置操作按钮的属性
            SetButtonBarInfo();

        }

    }
}

验证权限的两个函数

 
        /**//// <summary>
        /// 验证当前用户是否可以访问指定的功能节点
        /// </summary>
        /// <param name="functionID">要验证的节点</param>
        public void CheckFunctionID(string functionID)
        {
             //判断当前用户是否有权限访问该网页,
            string tmpFunctionIDs = "," + this.MyUser.FunctionIDs + ",";

            functionID = "," + functionID + ",";

            if (tmpFunctionIDs.IndexOf(functionID) >= 0)
            {
                //有权限
            }
            else
            {
                //没有权限
                Response.Write("没有权限");
                Response.Redirect("/noPermission.aspx");
                Response.End();
            }
        }
 
        /**//// <summary>
        /// 验证当前用户是否可以使用指定的按钮打开的页面
        /// </summary>
        /// <param name="functionID">要验证的节点</param>
        /// <param name="buttonID">要验证的按钮ID</param>
        public void CheckButtonID(string functionID, string buttonID)
        {
             //判断当前用户是否可以使用指定的按钮打开的页面,
            //获取当前用户可以使用的按钮
            string buttonIDs = MyUser.GetUserButtonID(functionID);

            buttonIDs = "," + buttonIDs + ",";
            buttonID = "," + buttonID + ",";
            if (buttonIDs.IndexOf(buttonID) >= 0)
            {
                //有权限
            }
            else
            {
                //没有权限
                Response.Write("没有权限");
                Response.Redirect("/noPermission.aspx");
                Response.End();
            }
        }
 

=========================
=希望我的想法,能够给您带来一点帮助!=
=大家一起研究、讨论,共同提高、发财!=
=========================

时间: 2024-07-31 06:38:11

【自然框架】 页面里的父类——把共用的东东都交给父类,让子类专注于其他。的相关文章

【自然框架】 页面里的父类—— 改进和想法、解释

  1. 从Control到GridView继承了多少层? (这个图可不是现做的,这是以前为了写QuickPager分页控件而弄的.http://www.cnblogs.com/jyk/archive/2009/04/29/1446033.html )        看上面的类图,远远超过三层了吧.如果简单的用"书上说,继承不能超过三层"."组合优于继承"来衡量的话,那么.Net框架能得到什么样的结论呢?      所以我说,简单的依靠"书上说"

【自然框架】 页面里的父类—— (补充)

      没想到下午发的<[自然框架] 页面里的父类--把共用的东东都交给父类,让子类专注于其他. >启发了热烈讨论,还以为又是一大堆的口水回复呢.看到大家的热烈讨论我很高兴,这才是我希望的讨论环境,无论是支持的还是反对的,我都非常感谢.对我的帮助是很大的,让我知道了哪些是大家可以接受的,哪些是不对的.比闭门造车,一个人写代码好多了.我觉得博客园是一片净土,感谢dudu为我们提供了一个讨论的环境!谢谢dudu,谢谢大家的帮忙!       写完了才发现,忘记写需求了,就是为什么要这么设计的原

【自然框架】——页面基类与设计模式(一)桥接模式(11.14补充了一段对桥接模式的理解)

  [自然框架] 页面里的父类-- (补充) [自然框架] 页面里的父类--把共用的东东都交给父类,让子类专注于其他.   ===================   以前发过两篇关于页面基类的文章,由于当时对于聚合.组合.桥接模式等不清楚,所以说的也是比较乱,这些日子又学习了一下程杰的<大话设计模式>,又有不少收获.现在我们再来重新分析一下.   先说需求:1. 对于MIS来说,大多数页面都需要验证一下访问者是否已经登录,是否有权限访问页面,是否有权限操作指定的记录. 2. 对于自然框架来说

【自然框架 NatureFramework】 项目结构、命名空间和命名规范

  请注意,这里说的是自然框架内部代码的项目结构,并不是说给客户做开发的时候,也需要这些项目.在给客户开发的时候,只需要引用编译后的dll 即可. 一.项目结构   自然框架的基本的思路还是共用函数,数据访问函数库.元数据管理.基础控件扩展.元数据控件(依据元数据动态创建的控件),用户登录.在线.权限管理,分页控件,页面基类构成. 这个并没有按照三层(分层)的要求去做,只是感觉这么分可以更清晰一些.把功能相当比较独立的部分做成一个项目.有一点MVC(不是asp.net MVC)的味道.我不想依据

借用 疯狂秀才 的页面,修改了一下自然框架后台管理的页面。

  不知道为什么,就是不喜欢extJS,昨天看到了疯狂秀才的页面,大家都说好,那我就借鉴一下吧.下载源码,加到aspx里面.运行,居然有js错误.一模一样的呀,怎么出错了?仔仔细细看了n遍,终于发现了不同的地方--多了一个表单<form > .去掉了就ok了.   然后就是修改菜单了.秀才的菜单是写死在页面里的js形式,我是喜欢动态加载的,于是用了一个古老的方法,在后台组合html,哦不对是js脚本了. 写代码,运行,调试,ok.   private void BindNode()      

页面里的父类——BaseUI源代码下载(2009.10.15更新)

    一.介绍和下载 名称: 页面里的基类(BaseUI) 版本: 1.0.2 上传时间: 2009.10.15 主要功能: 权限验证,URL参数获取.验证,自定义控件的赋值等. 下载: http://www.naturefw.com/down/List1.aspx  说明: 压缩包里面包含"页面里的基类(BaseUI)"和"当前登录人管理(UserManage)"两个项目的源代码.所以您下载了这个包就不需要在去下载"当前登录人管理(UserManage

【自然框架】——页面基类与设计模式(二) 模板模式

  前篇:[自然框架]--页面基类与设计模式(一)桥接模式   桥接模式的补充:(下面的一段是桥接模式里后补充的一段,桥接模式的一个小结)   什么是交接模式?引用<大话设计模式>里的定义: 桥接模式(Bridge):将抽象部分和他的实现部分分离,使他们都可以独立的变化.(P229)   不知道大家有没有看懂这个定义,至少我是没弄懂,呵呵.再引用一段<大话设计模式>的一段解释:(P232)   小菜:"我觉得交接模式所说的'将抽象部分和他的实现部分分离',还是不好理解,我

【自然框架】——思路、结构、特点的介绍(初稿,欢迎大家多提意见)

  开场白 面向过程:面向过程是"写代码",根据客户提出来的需求来写代码,包括函数.一步一步的写,都写完了,功能也就实现了. 面向对象:面向对象是"做设计",先不考虑细节,而是先做总体设计.都设计好了,再去实现细节. 举例来说,面向对象是设计一部汽车,而面向过程是设计一个流水线生产汽车.设计一部汽车是要考虑客户的需求,考虑众多因素,然后画图纸.并不考虑到底如何把汽车生产出来(至少不是重点).流水线的目的呢,就是要把汽车生产出来,至于汽车是如何设计的并不关心. 以前&

【自然框架】CMS之数据库设计

    在园子里也混了三年多,随笔200多,一开始只是想把自己的经验写一下,后来呢弄出来了一个"自然框架",主要精力就放在了介绍自然框架的思路上面了.随笔多了就发现一个问题:有点乱.虽然博客有分组,但是只支持一级分组,不支持n级的.博客里也没有"栏目"这一类的设置.所以对于随笔的管理有有点力不从心了.有些兄弟看到我的博客,看到我说自然框架,然后就会很迷茫,自然框架到底是什么?能做什么?如果想看看的话,从什么地方开始看,按照什么顺序来看?   博客的这种形式就不大好解