无法从控件访问页面类

时间:2009-12-06 14:00:10

标签: asp.net visual-studio

我创建了新的网站项目。一些辅助类位于App_Code文件夹中。页面在根目录中。用户控件位于根目录中的UserControls文件夹中。所有页面类都在MyProjectName.Pages命名空间中定义。所有用户控件类都在MyProjectName.UserControls命名空间中定义。

我可以从我的页面访问控件,但是我无法从我的控件访问页面类!我使用Page属性并尝试将其强制转换为MyPage类(在开头使用MyProjectName.Pages包含指令)。编译器说,这是MyProjectName命名空间中没有类型或命名空间的页面。另外,我在对象查看器中看不到这些名称空间(MyProjectName.Pages和MyProjectName.UserControls)。我应该替换我的控件和页面,以便能够使用控件中的页面类吗?

3 个答案:

答案 0 :(得分:1)

您最好的选择是从网站切换到Web项目。

WebSite“项目”是ASP.NET 2.0中引入的Microsoft的寄养子项,旨在能够在部署站点后动态编译页面。因此,编译器必须准备好在构建页面时修改页面(包括引用和/或删除命名空间)的情况。微软解决这个问题的方法是让app_Code中的类与页面分开 - 它们是在不同的传递中编译的。

最初,这是ASP.NET 2.0中唯一的Web应用程序模型,但它引入了很多问题(您的只是其中之一),MS从ASP.NET 1.1(现在称为Web项目)重新引入了该模型。此模型没有任何这些限制,但动态部署apsx更加困难。

最重要的是,除非你真的需要能够动态替换aspx,否则你最好使用web项目。如果你这样做,你必须仔细看看你的网站设计

答案 1 :(得分:0)

您的问题的原因与网站项目的构建方式有关。由于它们被设计为由IIS构建,因此它们不会将项目中的每个文件打包成单个DLL;支持的联系是有限的。常用代码应该在App_Code中,而不是在页面类中。

另外,为什么要尝试从控件访问页面类?这是不寻常的,通常不应该被要求。

答案 2 :(得分:0)

我发现了一种方法。不确定是否由于此而导致垃圾回收回归,但是确实如此。

在您的UserControl(ascx)文件中,为“父”页面对象创建一个类变量(vb.net示例):

Public _page as Object

在Page类的Page_Load()方法的顶部添加以下内容:

<user_control_obj>._page = Me

现在,在用户控件中,您可以引用_page来访问Page Object实例中的任何属性或方法。