Page 标签的 CodeBehind, CodeFile, Inherits 的理解

  偶然需要用到一下ASP.NET,刚一开始就遇到了麻烦,@ Page 指令的CodeBehind, CodeFile, Inherits这几个属性,让我着实费解了一番。下面记录一下自己的理解,仅供参考。首先还是列出以下MSDN上的定义吧:

 

  CodeFile:指定指向页引用的代码隐藏文件的路径。此特性与 Inherits 特性一起使用,用于将代码隐藏源文件与网页相关联。此特性仅对编译的页有效。此特性用于网站项目。CodeBehind 特性用于 Web 应用程序项目。

  CodeBehind:定包含与页关联的类的已编译文件的名称。该特性不能在运行时使用。此特性用于 Web 应用程序项目。CodeFile 特性用于网站项目。

  Inherits:定义供页继承的代码隐藏类。 它可以是从 Page 类派生的任何类。 此特性与 CodeFile 特性一起使用,后者包含指向代码隐藏类的源文件的路径。Inherits 特性在使用 C#作为页面语言时区分大小写,而在使用 Visual Basic 作为页面语言时不区分大小写。如果 Inherits 特性不包含命名空间,ASP.NET 将检查 ClassName 特性是否包含命名空间。 如果包含,ASP.NET 将尝试使用 ClassName 特性的命名空间加载 Inherits 特性中引用的类。(这假定 Inherits 特性和 ClassName 特性使用同一命名空间。)

 

 

其实MSDN上的说明已经非常清晰了。但是,如果是一个刚刚接触asp.net的人,恐怕还是有点迷糊。我们一点一点分析:

  1. 首先解释一下网站项目和web应用程序。
  我们用vs创建web相关的工程的时候,有一种叫web application, 还有一种叫web site.这两种工程的应用环境是有差别的,他们各有优劣。通常web application用于大中型项目,因为它部署很灵活,定制性比较强,而且可以方便的控制dll的名称版本,方便做单元测试等等。而web site通常用在中小型项目,因为它可以根据部署的源代码实时编译,而不需要重新编译整个工程,可在生产服务器上直接编辑文件。可以生成多个dll,然后在用到该dll的时候才加载,这在某些应用环境下是可以提高效率的。详细的差异请参考:http://msdn.microsoft.com/zh-cn/library/dd547590.aspx。而我只想解释一下,MSDN的概念。CodeBehind 特性用于 Web 应用程序项目,而CodeFile 特性用于网站项目。

 

  2. 下面详细说下CodeBehind。
  CodeBehind是ASP.NET早期的代码隐藏模型,是为了界面设计和编码分离。他可以指定一个编译文件(这个地方是说,如果aspx页面也要编译,那么一定要在.cs文件编译之后,否则可能找不到相应的类代码啊。当然如果aspx不编译就指向bulid action为compile的cs就可以了),该特性不能在运行时使用(这个我理解为,这个特性在运行时没什么用处,在设计阶段很有用,比如在可视化界面点击button,能直接在对应的代码类中生成事件处理代码。),它的作用就是在预编译的时候,aspx页可以找到那个隐藏代码文件(就是.aspx.cs文件), 然后引用其中的变量方法等等。当部署在服务器处理请求的时候,用这个代码处理,生成结果页面等等。
   值得一说的是,在CodeBehind指定的.cs文件中,不能直接引用.aspx页面的控件。如果需要使用,那么需要声明一个类变量,它的变量名应该与页面的控件Id相同。如果隐藏代码文件声明了控件变量,页面编译的出来的代码类中,不会再定义这些控件变量了,都在.cs文件的类中。如果,隐藏代码文件没有声明变量,那么取决于类是否为部分类,是部分类的话,控件变量会编译到该类中。不是部分类的话,则直接变成子类的变量了。  
  当然,在web application的工程中,通常有一个.aspx.designer.cs文件存储了这些控件的声明(我们可以干掉它,在.aspx.cs文件中声明也是可以的)。这种结构的前提是需要部分类的支持。另外,这个.aspx.cs, 和 .aspx文件的名字不用非得一样,他们之间通过CodeBehind关联,但是.aspx.designer.cs 和 .aspx.cs文件的名字要一样,才能正确关联。当然,都一样是最好的,好看好理解。
     
  3. 下面详细说下CodeFile。
  如同上面的定义,CodeFile,指定指向页引用的代码隐藏文件的路径,用于将代码隐藏源文件与网页相关联。同样是为了界面设计和编码分离。这是ASP.NET 2.0 版中新的网页代码隐藏模型。它有什么特点呢,首先一个改进就是它不需要在.cs文件中声明控件了。因为,有了CodeFile属性,再把代码隐藏文件中的类定义成部分类,在编译的时候,控件代码就可以自动合在一起。所以,你会发现,即使在.cs的类中,没有控件变量的声明,仍然可以调用。编译后的dll中, 控件变量是会合并入.cs文件的类当中的。
  定义中还提到仅对编译页有效,的确,如果aspx页面的bulid action不设置成compile,你会发现仍然无法直接引用页面的控件。毕竟需要编译了才能让部分类合在一起嘛。另外使用CodeFile还有一个好处,就是部署到服务器的时候,如果带着源代码,那么它可以时时编译的。这意味着我们修改服务器的.cs文件,却不需要重新的显示编译,就可以把更改反映到站点中。很方便,很灵活啊。当然它也有自身的缺点,可以到MSDN上看看。

 

  4. 最后说一下Inherits。
  这个属性的作用比较明确,就是指定aspx页面编译的类继承自谁。结合CodeFile和CodeBehind就会产生不同效果了。如果不指定这个属性,那么直接继承自Page类。另外,我们完全也可以不指定CodeBehind和CodeFile属性。这个时候就是很单纯的继承了。和CodeBehind的情况基本一样。只不过,如果你在可视化的界面拖拽控件,点击生成事件的处理代码,会出现在aspx页的<script runat="server"></script> 中,它将不能定位到.cs文件了。这就是没有代码和设计分离模型的情况了。

   

  匆忙中没有截图和代码,希望见谅。如有错漏,恳请指出,不胜感激~

 

参考文献:

http://msdn.microsoft.com/zh-cn/library/015103yb(v=vs.80).aspx
http://msdn.microsoft.com/zh-cn/library/dd547590.aspx
http://msdn.microsoft.com/zh-cn/library/ms227671.aspxs

转载于:https://www.cnblogs.com/xudeyu/archive/2012/01/19/2326338.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值