2009-12-06 111 views
0

我已经创建了新的Web站点项目。一些助手类位于App_Code文件夹中。页面位于根目录中。用户控件位于根目录下的UserControls文件夹中。所有页面类都在MyProjectName.Pages命名空间中定义。所有用户控件类都在MyProjectName.UserControls命名空间中定义。无法从控件访问页面类

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

+0

我怎么能看到我的网站项目的所有命名空间? – Sevina 2009-12-06 14:02:30

回答

1

最好的办法是从网站切换到Web项目。

网站“项目”是微软在ASP.NET 2.0中引入的养子,希望能够在网站部署后动态编译页面。因此,编译器必须准备好在页面被修改后(包括名称空间的引入和/或删除)页面的情况。微软对这个问题的解决方案是让app_Code中的类与页面有些分离 - 它们被分别编译通过。

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

底线是,除非你真的需要能够在飞行中替换aspx,否则你最好使用web项目。如果你需要仔细看看你的网站的设计

+0

谢谢你的详细解释!你能告诉我,我该怎么做才能切换到Web Project?我应该改变一些IIS设置或web.config中的设置? – Sevina 2009-12-06 15:29:28

+1

这是我在MSDN上找到的链接:http://msdn.microsoft.com/en-us/library/aa983476%28VS.80%29.aspx – mfeingold 2009-12-06 18:55:16

0

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

此外,为什么你想从你的控件访问你的页面类?这是不寻常的,通常不需要。

+0

我已经迁移了!非常感谢!但是不应该控制使用某些属性,它们对于几个控件和页面很常见 - 比如用户ID - 从Cookie userID中检索 - 这在pge上定义并在某些控件中使用,所以它们应该cast page class – Sevina 2009-12-07 15:02:56

+0

在网页上定义这样的属性并不是一个上帝的想法。这种方法很脆弱,容易中断。有更好的方法 - 即你可以从Web.Page派生你自己的页面类并在那里定义这些属性。你的页面可以来自你的页面类。 – mfeingold 2009-12-07 16:35:24

+0

@Sevina:您可以使用控件上的属性将数据从页面传递到控件。这比试图让控制以某种方式回到页面好得多。另一种可能性是在HttpContext.Items []的每个请求缓存中设置参数,或者使用具有项目级作用域的函数,而不是将这些函数放入页面中。 – RickNZ 2009-12-07 17:16:12