ASP.NET CodeFileBaseClass 属性与从 System.Web.UI.Page 继承

Dan*_* T. 5 asp.net inheritance base-class

我刚刚通过继承为我的页面创建了一个基类System.Web.UI.Page

public abstract class PageBase : System.Web.UI.Page
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我注意到您还可以在 ASP.NET 视图中声明一个基页时:

<%@ Page Language="C#" CodeFileBaseClass="PageBase.cs" CodeFile="page.aspx.cs"
    Inherits="page" %>
Run Code Online (Sandbox Code Playgroud)

有人可以解释这两种方法的优缺点吗?你什么时候会使用一个而不是另一个,或者它们都是一样的?如果同时使用两者会怎样?

Nop*_*ope 5

CodeFileBaseClass, CodeFile,Inherits与继承一起工作,而不是代替继承。

例如,指定CodeFile="page.aspx.cs"page.aspx.cs存在将导致:

Parser Error Message: The file '/page.aspx.cs' does not exist.
Run Code Online (Sandbox Code Playgroud)

假设page.aspx.cs存在,指定CodeFileBaseClass="PageBase.cs"PageBase.cs存在将导致:

Parser Error Message: Could not load type 'PageBase.cs'.
Run Code Online (Sandbox Code Playgroud)

另一方面,您可以PageBase 从不指定CodeFileBaseClass属性的情况下继承。然而,当从基类引用页面上的控件时,这可能会导致可能的意外行为。

引用Microsoft 的 @Page MSDN 文档

CodeFileBaseClass
为页面及其关联的代码隐藏类指定基类的类型名称。此属性是可选的,但在使用时, CodeFile属性也必须存在。当您想要实现共享方案时使用此属性,在该方案中您在基类中定义公共字段(以及可选的关联事件)以引用在网页中声明的控件。由于 ASP.NET 代码生成模型,如果您在基类中定义字段而不使用此属性,则在编译时将为网页中声明的控件生成新的成员定义(在单独的部分类存根中),并且您想要的场景不起作用。但是如果你使用CodeFileBaseClass属性将基类与页面相关联,并且您使分部类(其名称分配给Inherits属性,其源文件由CodeFile属性引用)继承自基类,则基类中的字段将能够在代码生成后引用页面上的控件。