【问题标题】:Referencing types not in the App_Code folder from asp.net application从 asp.net 应用程序引用不在 App_Code 文件夹中的类型
【发布时间】:2009-07-22 15:48:07
【问题描述】:

我在一个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 文件夹就足够了;问题是,除非我还在 App_Code 下或在新程序集中为母版页创建基类,否则 HelperPage 将无法访问 MasterPage ......这可能是最明智的解决方案,但我在徘徊如果有办法避免这种情况 - 无论如何我无法理解为什么你不能访问应用程序中声明的类型......

【问题讨论】:

  • 我确信有一种正确的方法可以做到这一点,我只是不知道它是什么。您会注意到我尽可能不使用网站的一些原因。

标签: c# asp.net master-pages


【解决方案1】:

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

编辑:

我不明白为什么你不能访问应用程序中声明的类型...

原因是页面被编译成多个程序集。如果您查看要发布到的文件夹,您会看到一堆 .dlls,名称类似于 App_Web_xxxxxxxx.dll

来自MSDN

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

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

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

【讨论】:

  • 谢谢!这正是我想知道的,但我找不到任何参考。
【解决方案2】:

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

【讨论】:

  • 实际上这对我不起作用...即使我在类定义周围添加命名空间并使用完全限定名称引用它,我仍然会遇到相同的错误。
  • 是否在同一个程序集中?您可能需要添加参考。还可以查看对象资源管理器,看看是否可以在其中找到对象。这可能会让您了解正在发生的事情。此外,如果您可以拍摄解决方案资源管理器的快照,那么类视图列表会显示试图从类继承的页面和类本身会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多