我有一个VS2008解决方案,有2个项目,WebUI和Domain; WebUI引用域
WebUI项目中的根命名空间是:MyCompany.MyProjectName.WebUI
域项目中的根命名空间为空。 (为所有类手动声明命名空间)
所以一切都运行正常,直到我尝试通过完全限定的路径引用Domain中的类: MyCompany.MyProjectName.Domain.EntityClasses.SomeClassName
VS无法找到班级。 但是,如果我在代码文件的顶部做: 导入MyCompany.MyProjectName.Domain.EntityClasses
....然后它可以看到它。 (就像SomeClassname,而不是完全限定的名称)
这有意义吗?
所以,然后我清除了我的WebUI Root命名空间,瞧,完全合格的声明然后工作。但是,这样做似乎使我的页面上所有用户控件的注册无效。似乎解决这个问题的唯一办法是在每个用户控件的代码隐藏中,手动添加MyCompany.MyProjectName.WebUI的命名空间 ...这可能是有意义的,因为页面的名称空间可能仍然保留了根名称空间值。但是,如果我要创建一个全新的aspx页面并删除用户控件(这是在手动添加命名空间之前),即使该页面也无法正确注册它。然而,uwer控件在设计视图中正确呈现....所以VS UI似乎能够正确解析它,但编译器似乎不能。
所以从我所知道的情况来看,我至少可以通过在适当的命名空间中手动包装用户控件来完成工作。为什么这对于没有指定命名空间的aspx页面来说是必要的,看看用户控件似乎毫无意义。
我有误解的一些基本原则吗?
答案 0 :(得分:1)
好的,我认为这是问题所在:
如果为项目指定了根名称空间并创建了新的aspx页面,那么aspx页面将在创建时的定义中对根名称空间进行硬编码,即:
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/MasterPages/DefaultMasterPage.Master" CodeBehind="Home.aspx.vb" Inherits="yourCompany.yourApp.WebUI.Home" %>
...即使您更改项目根命名空间,也永远不会改变。如果您在创建页面时没有根名称空间,那么您将获得:
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/MasterPages/DefaultMasterPage.Master" CodeBehind="Home.aspx.vb" Inherits=".Home"
因此,如果您在中途更改根命名空间,则所有先前的aspx页面都将其命名空间硬编码为旧值。但是,我认为后面的代码是aspx 做对root命名空间的删除作出反应,所以你开始使用用户控件等获得奇怪的行为而且你有进入后面的所有代码并在那里显式设置匹配的命名空间,以使页面正常工作。在这种情况下,我认为最好的办法是搜索所有的aspx文件以获取命名空间的这个显式定义(在Inherits标记中)并删除它。我认为,如果您愿意,您应该仍然可以在代码隐藏中显式设置命名空间,而aspx将继承该命名空间。不过100%肯定。
简而言之,在开始时决定你想要哪个命名空间命名方法并坚持下去。
答案 1 :(得分:0)
我建议你使用Web应用程序项目格式来避免这种情况。网站项目是除了简单网站之外的其他任何项目的逆行。