`

关于aspx页面类继承于cs页面类

    博客分类:
  • .NET
阅读更多

cs页面类继承自System.Web.UI.Page类,一般和文件同名,如果遇见关键字的情况才会自动使类名前加个'_',例如:_Default。关于cs页面类我们经常使用,它事实上是一个部分类,除了在cs文件里有一部分以外,在designer.cs文件还有另一部分(声明控件)。我们来谈谈其派生类---aspx页面类(从<%@Page里的Inherits属性可以看出),虽然我们编程的时候主要是针对cs页面类,但事实上在页面运行时,比如说cs页面类有一个Button的单击事件,.NET是到aspx页面类里找的,但由于aspx页面类是继承了cs页面类,所以.NET在aspx页面类里也能找到该单击事件,其他成员也是一样的道理。所以你会发现自动生成的事件的访问级别都是protected。所以你在cs页面类里自定义的方法(当然还有字段,属性等其他成员变量),如果在apsx页面类要使用的话,你也要将该方法的访问级别设为public或protected。这里的使用指1.<%# %>和<%= %>(http://kendezhu.iteye.com/blog/737526)及2.①<script runat="server"></script>和②<% %>(①里的代码在aspx页面类里就相当于你在cs页面类的类括号里的代码,写的就是类里的成员方法。②里的代码在aspx页面类里就相当于你在cs页面类的大概是Render方法里的代码,已经位于页面生命周期的Render阶段,已是晚期了,只能写方法里能写的代码。<script runat="server"></script>里的代码被编译进aspx页面类里了!<%%>里的代码被编译进该类的Page_PreRender方法(所以同样是对一个Label的text赋值,在<%%>里赋的值会在后面)。http://www.cnblogs.com/Lyhik/archive/2008/02/08/1066113.html

http://bbs.firnow.com/dview16t27811.html的10楼),1和2里代码就相当于派生类自己的成员,不管这些成员是什么访问级别,在页面执行时肯定会被访问到。而且写在这里面的代码不用重新生成,跟website方式一样(website没cs和designer.cs)。

根据ASP.NET页面对象模型:http://msdn.microsoft.com/zh-cn/library/aa479007.aspx里的真正Page类的说法,我们可以在<script runat="server"></script>里的方法里将aspx页面类实例化,这个类名就是其继承的cs类名(一般是小写)_aspx。当然这个类名可以通过Page的ClassName属性来修改。

说到继承我们不得不来讨论一下有关访问限制修饰符的知识:

首先可在命名空间下直接定义的类型有类(顶级类),结构,接口,枚举,委托等。它们只能被修饰为Public和Internal,如果未加任何修饰符,默认为Internal。

类的成员(成员变量,成员方法,属性,嵌套类等)可被修饰为Public,Private,Internal,Protected,如果未加任何修饰符,默认为Private,局部变量只在成员方法内有效,不能被访问修饰符修饰。嵌套类作为类中类,其也是一种成员,所以可以被修饰为Private,嵌套类类内的Private成员在外层类内也是无法访问(将嵌套类在外层类内实例化后再访问)。

Private只能修饰类和结构的成员,这些成员只属于该类,派生类虽然继承了其父类的private成员,但却访问不了(不能直接访问,但有方法,下面会讲到)。

Protected只能修饰类的成员,这些成员只能在父类及其派生类内访问。

Internal修饰的类型只能在同一个程序集内访问。

Public修饰的类型没有访问限制,在同一个程序集里:如果位于同一命名空间,可直接访问,如果位于不同命名空间,先引入该命名空间可访问。在不同程序集里:先引用该程序集再引入相应命名空间就可访问。

关于程序集:http://kendezhu.iteye.com/blog/745411

对于特殊的,如我们使用外部控件,这些控件是一些特殊的类,被编译在组件里,然后组件也有命名空间和程序集,同样要引用程序集,不过对于控件的程序集的引用要通过工具箱的选择项,引用后选择其中的相应组件。之后在我们将该控件拖入页面后就在解决方案资源管理器里就引用了该控件所在的程序集。同时页面上方会出现<%@ Register Assembly="**" Namespace="**" TagPrefix="**" %>这种类似于using的东西,分别是程序集,命名空间,前缀。可以像我们在使用Ajax扩展控件时做的那样,设置一下web.config文件,就不会出现这些注册信息了:http://kendezhu.iteye.com/blog/752240

前面说了,控件就是一些特殊的类,而我们在cs页面类敲出某个控件的id时,就相当于敲出了其实例(早在我们将控件拖入页面时,该控件就在cs页面类里实例化了,并且该实例化是在cs页面类内直接实例化的,而不是在方法里面实例化的),我们可以在id旁的智能提示里看到该控件是什么命名空间的什么类  类的实例所在的类及类的实例名(这里是控件id)。但有一点要清楚:本类不能在类下直接实例化,因为当该类实例化时里面还有一个本类的实例化,会导致web服务器关闭,可以在类的事件或方法里实例化,或直接用this(this指的是当前类的实例);其子类一样不能在类下直接实例化,因为子类继承了父类除构造函数和析构函数以外的所有东西;其父类可以在类下直接实例化,因为其父类"范围"比它小;其他不相关的类可以在类下直接实例化(这就是控件类的情况)。

下面我们来讲子类访问父类私有变量的问题:

1.将子类的对象作为参数传入父类的方法内,在父类的代码内部就可以通过子类的对象访问父类的Private成员了

子类:

        public class Class1:_Default

    {

        public string sss;

    }

父类:

        public partial class _Default: System.Web.UI.Page

    {

        private string xx = "xxxx";

        public void FangwenPrivate(Class1 cl,out string s)

       {

            s = cl.xx;

       }

        protected void Button1_Click(object sender, EventArgs e)

       {

            Class1 class1 = new Class1();

            FangwenPrivate(class1, out class1.sss);

            Label2.Text = class1.sss;

       }

    }

注意参数前面的out。该处使用了引用传递,只有这样才会改变实参class.sss的值,我们在Label2里才会看到改变后的

class1.sss的值。而我们经常使用的是值传递,无法改变实参的值。引用传递的另外两个关键字是ref和params。值得注意的是无论调用该函数还是原函数都应该在相应位置写明out,ref或params。

关于ref与out的区别:http://www.cnblogs.com/xuezheng/archive/2007/08/20/862769.html

再加上params:http://www.cnblogs.com/greatandforever/archive/2010/04/07/1706001.html

2.这种方法不光是面向有继承关系的类,对任两个类都起作用(一个类的公有方法返回值是该类的私有变量,另一个类调用该类的公有方法):

一个类:

            public class Class2

         {

             private int i;

             public int Getint()

          {

             return i;

          }

        }

另一个类:

               public partial class _Default: System.Web.UI.Page

           {

 

 

               protected void Button1_Click(object sender, EventArgs e)

               {

                      Class2 class2 = new Class2();

                      Label2.Text = class2.Getint().ToString();

                }

           }

3.这种方法也是对任两个类都起作用(在一个类中给私用变量指定一个属性)

一个类:

       public class Class2

    {

        private int i=2010;

        public int I

        {

            get { return i; }

            set { i = value; }

        }

     }

另一个类:

            public partial class _Default: System.Web.UI.Page

           {

 

 

               protected void Button1_Click(object sender, EventArgs e)

               {

                      Class2 class2 = new Class2();

                      Label2.Text = class2.I.ToString();

                }

           }

说到属性,很多书中说其是字段的扩展,我们也可以在vs中用封装字段的来给一个字段添加属性.但其实属性就是一种特殊的方法,它可以跟字段没有任何关系,如http://kendezhu.iteye.com/blog/749036后面个性化WebPart属性里那样用属性。再如:

             public string Attr   

        {

            get { return Label1.Text; }

            set { Label1.Text = value; }

        }

           protected void Button1_Click(object sender, EventArgs e)

        {

            this.Attr = TextBox1.Text;

             TextBox2.Text=this.Attr;

        }

前面说了属性就是一种特殊的方法,this.Attr=TextBox1.Text;设置属性就相当于调用了该属性里的set方法,参数是TextBox1.Text,然后方法里的局部变量就是value(是隐式定义的),这样就把值传给了Label1.Text。 TextBox2.Text=this.Attr;访问属性就相当于调用了属性里的get方法,直接返回值。

 

以前一直不明白为什么要封装字段搞出个属性来,直接把字段设置为public不就完了吗?看一下下面的例子也许会明白:

        private int attr;

        public int Attr1

        {

            get { return attr; }

            set {

                if (value < 0)

                {

                    value = 0;

                }

                attr = value;

            }

        }

          protected void Button1_Click(object sender, EventArgs e)

        {

            this.Attr1 = -1;

        }

可以看出通过字段的属性可以避免对字段进行一些错误的赋值,当然这只是一个方面,等发现其他作用,偶还会及时更新上来。

分享到:
评论

相关推荐

    asp.net页面编译流程

    - ASP.NET 将页面的.aspx 文件与.cs 文件合并成一个类。这个类继承自 System.Web.UI.Page 类。 - 在合并过程中,会自动为页面添加生命周期管理方法,如 Page_Init 和 Page_Load 方法。 3. **编译阶段**: - ...

    aspx如果引用cs中的变量的方法

    这是因为在ASP.NET框架中,ASPX页面会编译成一个类,并且默认继承自当前CS文件所定义的类。因此,私有成员无法通过这种方式访问。 2. **变量类型**:可以声明任何类型的变量,包括基本类型如`string`、`int`等,也...

    利用handler生成静态页面的完整解决方案_aspx开发教程.rar

    IHttpHandler接口是ASP.NET提供的一种处理HTTP请求的方式,不同于传统的ASPX页面,它不依赖于控件树和生命周期,因此更加高效。创建一个自定义的Handler类,实现IHttpHandler接口,我们就可以处理特定类型的HTTP请求...

    ASP.NET页面周期详解

    当IIS接收到一个.aspx页面的请求,它会调用aspnet_isapi.dll来处理。aspnet_isapi.dll创建并实例化与.aspx文件对应的代码-behind类(也就是你在_aspx.cs文件中编写的类),然后调用`ProcessRequest`方法来处理请求。...

    apsx public aspx page

    4. **Master Pages**:提供了一种创建统一页面布局的方法,可以将导航栏、页脚等共享元素定义在主页面中,子页面继承其结构。 5. **Data Binding**:方便地与数据库或其他数据源绑定,展示和操作数据。 【压缩包子...

    aspx网站示例

    ASPX页面同样支持使用CSS(层叠样式表)进行样式控制,以及JavaScript进行客户端脚本处理。通过结合这两者,可以创建更具交互性和响应性的网页。 **10. 模板和母版页** ASP.NET中的母版页(Master Page)允许定义...

    C#Web窗体类简单应用实例

    - `.aspx`文件:继承`BasePage.cs`的Web页面,它们可以直接调用基类中的方法和属性。 - `App_Code`目录:可能存放了与窗体类相关的辅助类或控件。 - `Web.config`:配置文件,可能包含了对应用程序的设置,比如...

    清除aspx页面缓存的程序实现方法

    所有用到页面缓存的aspx页面修改以下cs,让它继承一个自定义基类(例如:PageCacheBase); PageCacheBase 的 Page_Load 加入以下代码: string cacheKey = Request.Url.ToString(); Cache[cacheKey] = new object();...

    ASPX.NET学习笔记

    当网页运行时,ASP.NET会先处理.cs文件中的代码,然后处理.aspx页面中的内容。 在代码隐藏页模型中,开发人员的类在编译时被转换为程序集,加载到应用程序域,并在请求时实例化。这种模型有助于实现更好的代码管理...

    ASP.NET用户管理页面代码和运行效果图

    在HTML代码片段中,可以看到`&lt;%@ Page %&gt; directive`用于定义页面的基本属性,比如语言(Language="C#"),自动事件绑定(AutoEventWireup="true"),以及页面继承自哪个类(Inherits="Admin_Admin_UserList")。...

    【ASP.NET编程知识】ashx介绍以及ashx文件与aspx文件之间的区别.docx

    ashx 文件的处理过程也更加简单,使用 SimpleHandlerFactory 类来处理请求,而 aspx 文件使用 PageHandlerFactory 类来处理请求。 在.NET 中,ashx 文件可以继承 IHttpHandler 接口来处理请求。ashx 文件可以使用 ...

    北大青鸟ACCP5.0 ASP.NET 第二章课件

    每个.aspx文件都有一个Page对象,它是页面类的实例,所有.aspx页面都继承自System.Web.UI.Page类。在代码后置模式下,.aspx文件和后台代码类合并生成页面类。@Page指令用于定义页面的属性,如语言、自动事件绑定和...

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    4-01.aspx aspx页面中添加一个Lable标签。 4-02.aspx 读出Application的属性值。 4-03.aspx 读出SessionID的值。 4-04.aspx 创建Session对象。 4-05.aspx 读取传递的Session值并显示。 4-...

    详细的ASP.NET的参考文件

    而在代码隐藏模型中,页面和代码隐藏类是分开的,且.aspx.cs文件中的类是从.aspx文件生成的类派生的,这使得代码更清晰,逻辑更易于管理。 3.2 Page类: Page类是ASP.NET页面的基础,它提供了大量属性、方法和事件...

    关闭页面时清空Session (ASP.net ) (已实现)

    - `Default.aspx.cs`文件定义了`_Default`类,该类继承自`System.Web.UI.Page`。 - 在`Page_Load`事件处理函数中,首先检查查询字符串中是否存在`___command`参数,如果存在并且其值为“ClearSession”,则调用`...

    Asp.net2.0页面指令

    - **Inherits**:指定页面继承的类名。此属性允许页面继承自定义基类。 - **Language**:指定页面使用的编程语言,默认值为C#或VB.NET。 - **MasterPageFile**:指定该页面使用的母版页(Master Page)路径。 - **...

    ASP.NET做的供应商管理系统代码(过万行)

    `VendorAuditForm.aspx.cs`通常包含了与`VendorAuditForm.aspx`页面相关的C#代码,处理页面事件和业务逻辑;而`VendorAuditForm.aspx`是HTML和服务器控件的混合,定义了用户界面和交互元素。 以上只是这个系统的一...

    pagebase

    通过创建一个基类,你可以定义一些通用的方法、属性和事件处理程序,然后让你的ASPX页面继承这个基类。这样,所有继承`PageBase`的页面都可以自动获得这些功能,而无需在每个页面上重复编写相同的代码。 在描述中...

    asp.net网页里面为什么找不到CS文件

    在***开发中,Web窗体页通常由两部分组成:ASPX页面和CS代码后端文件。ASPX文件是用户界面,而CS文件包含了处理页面逻辑的代码。在实际开发过程中,开发者可能会遇到***网页里找不到CS文件的问题。这可能是由于多种...

    CodeSmithBS页面生成模板

    在这个资源中,我们有两个模板文件:`AspxCs.cst`和`Aspx.cst`。 `AspxCs.cst`可能是一个用于生成ASP.NET的C#后端代码的模板。在Asp.net开发中,C#代码通常用于处理服务器端逻辑,如数据库交互、业务规则验证等。这...

Global site tag (gtag.js) - Google Analytics