可以通过基类实现的几种功能。vs2008 .net 2.0

    我很懒,很不喜欢写重复的代码,一行重复的都不想写,所以当同一段代码要写第二遍的时候,我就会去想避免的方法。OO的特性之一 —— 继承 —— 可以帮很大的忙。

    这里只说UI部分,先看一个类的图。(我也不知道应该叫做什么图)

(TestList 、TestForm是网页.aspx ,上面的都是类 .cs )

    一般的软件(比如OA、CRM等)都是需要先登录,需要有一定的权限才能够访问,那么每个页面都需要验证一下是否已经登陆了,或者登录是否超时,以及是否有访问页面的权限,在具特点就是有没有添加、修改、删除,有没有编辑某一条记录的权限,这些操作都是可以放在基类里面的。

    BasePagePower  (.cs文件) 继承System.Web.UI.Page
    验证是否登录、登录是否超时,加载登陆人员的信息(ID,姓名,部门等),生成数据访问函数库的实例,然后在OnUnload事件里销毁实例。这样其他页面只要继承了这个类,就不用去想如何验证登录信息,如何获取登录人的姓名这一类的事情了。至于数据访问函数库的实例嘛,估计这个会有很大的争议,在这里实例化的目的是,一个人、访问一次页面,只生成一个实例。这样可以提高这个实例的利用率,因为我感觉数据访问函数库的“体积”有点大,生成一回,如果只做了一件事情(执行一个函数),那是不是太可惜了呢。另外在基类里面实例化以后,在继承的页面里调用的时候就和使用静态函数很像了,也不用考虑什么时候销毁对象,因为这个也在基类里面实现了。
    
    BasePage (.cs文件) 继承 BasePagePower
    在这里主要是处理URL传递过来的模块ID,验证一下这个参数是否正确(是不是数字),不是的话作出处理。还可以处理其它的参数,比如部门ID等,这个根据大家的情况灵活设置吧。在我的项目里,大部分页面都需要使用这个ID,可以用这个参数做很多的事情,比如验证是否有访问该页面的权限,加载控件的属性等。

    BasePageList (.cs文件)  继承BasePage 
    您可能会问了,有了上面的两个类就已经够用了,为什么还有哇,上面那两个也是应该合在一起的呀?因为我会在列表页面使用几个自己写的控件:分页控件、查询控件、显示数据的控件,对于这几个控件的属性设置可以放在这个基类里面来处理,这样表单页面就可以简单不少。

    BasePageForm (.cs文件) 继承 BasePage 
    有了列表页面的基类,对应的也要有表单页面的基类,对!这个就是。在这里要定义DataID和Kind。DataID是记录从URL传递过来的记录ID ,主要用来修改数据和显示数据用;而Kind也是从URL传递过来的,表示要添加、修改还是显示数据。当然在这里不仅要接收,同时也要验证一下参数是否正确,以避免注入攻击。
    
    控件的继承。表单嘛,都会有一个“保存”按钮吧,如果想要在提交数据之前,先在IE里做一下验证的,我的做法是给按钮加一个js的onclick 事件,而这个操作就很烦,每一个表单都要加一遍。现在可以在表单的基类里面定义一个按钮,然后在
OnInit 事件里加上这个js 事件就可以了。
 public class BasePageForm : BasePage
    {
        public Button Btn_Save;     //保存按钮
        override protected void OnInit(EventArgs e)
        {
            base.OnInit(e);
            Btn_Save.Attributes.Add("onclick", "return myCheck()");
            Btn_Save.Text = "基类里面设置Btn_Save";
    }
}
这样就可以了,表单页面继承之后,拖拽一个按钮,ID设置成 Btn_Save 就 ok 了。

    当然这里只是举一个例子,并不是说前台验证就一定要用这种方法,抛砖引玉吧。

    基类都准备好了,下面就可以作业面了,根据不同的情况,继承不同的基类,如果基类不够的话,还可以根据情况来决定是否需要在增加。

    下面是代码

    

public class BasePagePower : System.Web.UI.Page
    {
        /**//// <summary>
        /// 在基类里面定义数据访问的实例,一个用户,一次访问,只使用一个实例 
        /// </summary>
        public DataAccessHelp dal = new DataAccessHelp();

        /**//// <summary>
        /// 记录登陆人员的信息,您可以换成其他的方式来保存
        /// </summary>
        public string[] EmpInfo;

        初始化 在Page_Load之间执行#region 初始化 在Page_Load之间执行
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            //验证是否已经登陆

            //如果已经登陆了,加载登陆人员的信息,
            //这里使用数组,您也可以使用其他的您习惯的方式。
            EmpInfo = new string[6];
            EmpInfo[0] = "" ;
            //加载代码略

            //清除IE缓存
            Response.Cache.SetNoStore();
        }
        #endregion

        销毁数据访问层的实例 。#region 销毁数据访问层的实例 。
        override protected void OnUnload(EventArgs e)
        {
            if (dal != null)
                dal.Dispose();

            base.OnUnload(e);
        }
        #endregion

    }

 public class BasePage : BasePagePower 
    {
        /**//// <summary>
        /// 接收URL传递过来的模块ID,大部分页面都需要使用这个ID
        /// </summary>
        public string FunctionID = "";

        /**//// <summary>
        /// 部门ID。不是所有的情况都会传递
        /// </summary>
        public string DepartmentID = "-3";    

        初始化 在Page_Load之间执行#region 初始化 在Page_Load之间执行
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            this.FunctionID = Request.QueryString["fid"];

            验证模块参数是否是数字。#region 验证模块参数是否是数字。

            if (!Functions.IsInt(this.FunctionID))
            {
                Response.Write("模块参数不正确!");
                Response.End();
            }
            #endregion

            DepartmentID = Request.QueryString["did"];
            if (!Functions.IsInt(DepartmentID))
            {
                //没有传递,设置默认值
                DepartmentID = "-3";
            }

            //验证是否有权限访问该网页
            CheckPower();

        }
        #endregion

        验证权限 实现的代码#region 验证权限 实现的代码
        public void CheckPower()
        {
            //判断是否有权限访问该网页,验证方法略
        }
        #endregion

    }

public class BasePageList : BasePage 
    {
         //相关的操作
    }

public class BasePageForm : BasePage 
    {
        /**//// <summary>
        /// 接收URL传递过来的记录ID,用于显示、修改数据
        /// </summary>
        public string DataID;     

        /**//// <summary>
        /// 接收URL传递过来的操作方式。
        /// 1:添加、2:修改、3:显示数据
        /// </summary>
        public string Kind;

        public Button Btn_Save;     //保存按钮
        public Button Btn_Save2;

        初始化 在Page_Load之间执行#region 初始化 在Page_Load之间执行
        override protected void OnInit(EventArgs e)
        {
            base.OnInit(e);
            this.DataID = Request.QueryString["id"];    //接收记录ID
            this.Kind = Request.QueryString["k"];       //接收操作方式

            验证模块参数是否是数字。#region 验证模块参数是否是数字。
            if (!Functions.IsInt(this.DataID))
            {
                Response.Write("记录ID不正确!");
                Response.End();
            }
            #endregion

            Btn_Save.Attributes.Add("onclick", "return myCheck()");
            Btn_Save.Text = "基类里面设置Btn_Save";

            if (Btn_Save2 != null)
                Btn_Save2.Text = "基类里面设置Btn_Save2";

        }
        #endregion

        
    }

时间: 2024-11-09 02:21:12

可以通过基类实现的几种功能。vs2008 .net 2.0的相关文章

第13周-任务3-抽象基类Shape及派生类Circle、Rectangle和Triangle

[题目]写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形).Rectangle(矩形).Triangle(三角形).用如下的mian()函数,求出定义的几个几何体的面积和. int main() { Circle c1(12.6),c2(4.9); //建立Circle类对象c1,c2,参数为圆半径 Rectangle r1(4.5,8.4),r2(5.0,2.5); //建立Rectangle类对象r1,r2,参数为矩形长.宽 Triangle t1(4.5,8.4

Asp.Net+XML操作基类(修改,删除,新增,创建)第1/2页_实用技巧

/**********************************************************************************  *   * 功能说明:XML处理基类  * 作者: 刘功勋;  * 版本:V0.1(C#2.0);时间:2006-12-13  *   * *******************************************************************************/ using System;

Asp.net 字符串操作基类(安全,替换,分解等)_实用技巧

/********************************************************************************** * * 功能说明:常用函数基类 * 作者: 刘功勋; * 版本:V0.1(C#2.0);时间:2006-8-13 * * *******************************************************************************/ /***********************

PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述

复制代码 代码如下: <?php /* 边学边做的,为方便自己翻阅而发布,更为得到高人指点而发布,欢迎高手指点...... [提示]本例通过测试无误 [情景设计] 模拟计算机主板IDE接口,比如:主板可以存取的储存器常常有光驱.硬盘.闪存等等, 为了方便,有必要对这些不同的储存器设定同一的接口. 本例还假设一种前所未有的.存取方式与众不同的外星储存器也要加到主板上进行存取, 于是需要采用耦合的设计模式. [本例主要讲述] 1.通过接口.抽象类.一般类继承三种方式达到所谓的"接口"

Microsoft .NET 中的基类继承

接口继承 创建抽象类时,请使用关键字 Interface 而不是 Class.为接口命名,然后定义需要子类实现的所有属性和方法.这是因为基类中没有可以实现的属性和方法,它只包含一般数据,而不包含方法.您所创建的只是一个合约,它规定所有使用此接口的子类都必须遵循一定的规则. 1.        现在,请在已创建的项目中添加一个新类. 2.        从 Visual Studio 菜单中,单击 Project(项目),然后单击 Add Class(添加类). 3.        在类中添加以下

Microsoft .NET 中的基类继承(2)

现在,请在已创建的项目中添加一个新类. 从 Visual Studio 菜单中,单击 Project(项目),然后单击 Add Class(添加类). 在类中添加以下代码:Interface Person   Property FirstName() As String   Property LastName() As StringSub Print()   Sub Talk()End Interface您会发现,您定义属性和子过程的方法与您通常定义这些属性和过程的方法一样.唯一的差别在于,您没

为数据访问层编写一个基类

访问|数据 在编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建Command对象,创建数据适配器,创建数据集,填充数据集,关闭连接.这种重复的代码写一两次到还行,写多了就免不了有一些烦了. 在总结以前的代码以后,决定重构数据方法层的代码.数据访问层无非进行两种操作:查询返回DataTable,进行插入.更新.删除等无返回值的操作.只要增加一个数据访问层基类包含这些繁琐的代码,其余的数据访问层代码继承数据访问层基类,在调用基类函数时给出存储过程

用.Net构架你的系统(基类的搭建思路)

.Net出来之后,给我们的VB程序员有了一种前所未有的眼前一亮的感觉,不是说他简简单单的从VB6.0升级到了VB7.0,是一种不被别人看贬的感觉.以前好像VB程序员总比别的语言的程序员的地位低.现在不会了,.Net实现了真正的面向对象,看起来有一点点的不适应,但是对有Java,PB基础的人来说还是很光明的一件事,这样我们可以建立自己的VB.NET基类为以后的开发做好坚实的准备,不必再开发还要从头开始,只是继承一下自己的逐步构建起来的基类即可,这是一种思路,也是一种积累,是对我们知识的很好的充份利

C++:派生类访问模板化基类(templatized base class)的命名

派生类继承模板化基类的成员函数, 默认是无法访问, 模板化基类的命名. 原因是模板的定制化有可能取消某些函数, 为了能在编译期检测出错误, 所以默认无法访问. 派生类访问模板化基类, 包含三种方法: 1. 调用基类函数时, 使用"this->", 指明调用的类, 是本类, 在编译时, 可以进行检查; 2. 使用using声明式, 可以把基类的函数引入派生类, 在编译时, 可以进行检查; 3. 使用显示修饰(explicit qualification), 不推荐, 显示修饰会屏蔽