从asp.net应用程序引用不在App_Code文件夹中的类型

时间:2009-07-22 15:48:08

标签: c# asp.net master-pages

我在asp.net项目中有一个母版页,它提供了一个我想通过辅助函数在派生类中调用的方法,所以我尝试为我的页面创建一个基类:

// the master page 
public partial class TheMasterPage : MasterPage {
    public string TheMethod(string s1) {
        // ...
    }
}
// base class providing an helper method
public class HelperPage : Page {
    protected bool HelperMethod() {
        string value = ((TheMasterPage)this.Master).TheMethod("some value");
        return (value == "something");
    }
}
// derived class
public partial class Page1 : HelperPage {
    protected void Page_Load(object sender,EventArgs e) {
        if (HelperMethod()) {
            // ...
        }
    }
} 

但如果我尝试这样做,我会收到错误消息“无法找到HelperPage的类型或命名空间”。
有没有办法做我正在尝试做的事情而不将主页中的方法移动到App_Code文件夹?
一般来说,是否可以从asp.net应用程序中引用应用程序本身中定义的另一种类型?

修改
@John Rasch

  

我看到这样做的方法是将基页存储在不同的程序集中。这样,您所要做的就是添加对该程序集的引用,并且您可以从HelperPage类型继承。

将一切移动到App_Code文件夹就足够了;问题是,这样HelperPage将无法访问MasterPage,除非我还为App_Code或新程序集下的母版页创建基类......这可能是最明智的解决方案,但我在游荡如果有办法避免这种情况 - 无论如何我无法理解为什么你无法访问应用程序中声明的类型......

2 个答案:

答案 0 :(得分:1)

我看到这样做的方法是将基页存储在不同的程序集中。这样,您所要做的就是添加对该程序集的引用,并且您可以继承HelperPage类型。

编辑:

  

我无法理解为什么你不能访问在应用程序中声明的类型......

原因是因为页面被编译成多个程序集。如果您查看要发布到的文件夹,您会看到一堆名为.dll的{​​{1}}。

来自MSDN

  

默认情况下,编译器可以使用   “批处理模式”,其中输出   多个源文件被编译成   根据的单一组件   文件类型,文件依赖性和   其他标准。结果是一个目标   包含一组程序集的站点   与可执行代码   原始源文件。

     

在某些情况下,组件   使用批量编译创建的可能不会   非常适合将网站部署到网站   生产服务器。程序集名称   是由...自动生成的   编译器,因此不是   很明显哪些组件映射到哪个   源文件。编译器也   每次运行时都会创建新名称,   这样组件的名称可能会   每次之后都不一样   汇编。另外,如果来源   文件已经改变,编译器可能会   批量处理源文件不同,   意味着产生的组件   不一定代表相同   源文件。如果你正在维持   部署了网站并想要更新   只有最近的组件   更改,批处理的输出   编译可以使这项工作更多   复杂。

我猜你可以使用MSDN site上的合并工具来确保整个应用程序驻留在一个程序集中,但这看起来有点过分了。为简单起见,我会坚持使用App_Web_xxxxxxxx.dll文件夹。

答案 1 :(得分:0)

您需要指定HelperPage的完全限定名称。您通常可以通过查看类定义之前的代码的namespace {}部分来确定这一点。我想如果你将鼠标悬停在你的班级名称上,它也会告诉你。