65.9K
CodeProject 正在变化。 阅读更多。
Home

创建嵌套式 Web 应用程序。

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.31/5 (13投票s)

2003年9月30日

4分钟阅读

viewsIcon

81649

downloadIcon

409

C# Web 项目的层次化组织(集成 VSS)。

引言

为了处理多开发人员解决方案,我面临着如何将我的 Web 应用程序组织成一个层次结构的问题。作为一名 ASP 开发人员,我习惯于将所有公共内容放在根目录(或一个“include”目录)中,然后将所有站点部分放在子目录中。

这样的结构

        RootWeb
        -- SubWeb1        
        ----SubSubWeb1 
        ----SubSubWeb2 
        -- SubWeb2 
        .... you got the idea.

使用 VS.NET (2003) 以这种方式进行开发并非易事,但经过一些努力,您可以非常接近。关于本文的一个免责声明:我还没有在实际的软件生产环境中使用它,但我很快就要开始了。希望读者能给我一些提示或修正!那么,我们开始吧……

思路是在构建阶段创建 Web 项目的层次结构,并将所有程序集复制到根目录的“bin”文件夹中。创建一个 Web 项目目录(“C:\Projects\RootWeb”)。在 IIS MMC 中,创建相应的虚拟目录。我在“默认网站”上创建了一个名为“RootWeb”的虚拟目录(新建->虚拟目录->下一步->别名=“RootWeb”->目录=“C:\Projects\RootWeb”->保留默认权限)。您需要为虚拟目录配置 FrontPage 服务器扩展。

技巧 1

至少对于 W2K,您之前使用的 IIS MMC 中没有配置 FPSE 的菜单项。关闭 MMC,然后重新打开它。右键单击 RootWeb 虚拟目录,“所有任务”中会出现一个“配置服务器扩展”条目。保留所有默认选项。

现在在 VS.NET 中:在“C:\Projects\RootWeb”中创建一个名为“RootWeb”的空白解决方案。在其上创建一个新项目:新建项目->Visual C# 项目->ASP.NET Web 应用程序->位置=“https:///RootWeb”。创建一个新项目:新建项目->Visual C# 项目->ASP.NET Web 应用程序->位置=“https:///RootWeb/SubWeb1”。

默认的 Web 项目是使用 FrontPage 访问创建的。您必须转换项目以使用文件共享。这样您就可以轻松使用 VSS 集成了。转换后,只需使用“添加到源控件”。

请注意,即使您将使用文件共享,也必须在服务器上配置 FrontPage 扩展。

如果您(或其他开发人员)想在另一台计算机上使用同一个项目,您必须转到文件菜单->源控件->从源控件添加项目。

在 C# 项目中,您可以使用后期生成事件。在 VS.NET IDE 中,您无法从 IDE 为 Web 应用程序指定后期生成脚本,但绝对可以在“.csproj”文件中设置它。

技巧 2

打开“.csproj”文件(“C:\Projects\RootWeb\SubWeb1\SubWeb1.csproj”)并为 `PostBuildEvent` 指定值。在这种情况下,我们只需将生成的程序集复制到根目录的“bin”文件夹中,因此类似: `PostBuildEvent = "move $(TargetDir)$(TargetFileName) C:\Projects\RootWeb\bin\"`。

技巧 3

如果 `TargetDir` 包含空格,复制命令将失败(这是标准的 DOS 复制命令)。您知道,可以通过指定带双引号的路径来解决此问题。但“.csproj”文件是 XML 文件,如果您放入双引号,它将出错。因此,我们将属性分隔符从双引号更改为单引号(使用您喜欢的编辑器将所有“替换为')。这样“.csproj”文件仍然是格式正确的 XML 文件,我们可以将双引号放在路径周围: `PostBuildEvent = 'move "$(TargetDir)$(TargetFileName)" C:\Projects\RootWeb\bin\'`。

您还必须删除**子项目**中的“global.asax*”和“web.config”文件,并从“.csproj”文件中删除相关条目。

注意:您可能想将 `DefaultHTMLPageLayout` 更改为 `flow` 以获得 HTML 兼容性。每个新创建的 Web 窗体都将具有此设置。要更改自动创建的“WebForm1.aspx”,请删除字符串 `MS_POSITIONING="GridLayout"`,或在 IDE 中进行更改。

在“RootWeb”的“WebForm1.aspx”中写入一些有用的内容(例如“Hello World from the Root web”)。在“RootWeb\Sub1”的“WebForm1.aspx”中写入一些有用的内容(例如“Hello World from the sub web 1”)。现在,您可以构建解决方案并在 `https:///RootWeb/webform1.aspx` 和 `https:///RootWeb/SubWeb1/webform1.aspx` 下进行测试了。如果您在根 Web 中创建了一个“.ascx”控件,您可以通过将其拖放到 Web 窗体上来在所有子 Web 中使用它。此外,Web 应用程序的上下文在所有子 Web 文件夹中都是相同的。

改进

这样做很繁琐,并且您必须告诉每个开发人员如何操作。企业模板可以为您提供帮助。定义一个包含所有这些内容的新模板将可以简化这个问题。(请参阅 MSDN 上的教程:MSDN)。如果目标目录根据根目录路径自动参数化,那会更好。以这种方式组织 Web 可能会导致一些名称重复。您最好根据目录结构命名命名空间。对于 `RootWeb\Sub1\WebForm1.aspx`,您必须指定

namespace RootWeb.SubWeb1

结论

通过这样做,您可以以分层方式组织 Web 应用程序。

本文提出的解决方案很复杂,并且在 VS.NET 的未来版本中,可能很难或不可能移植。

也许有人知道 VS.NET 的未来版本(Whidbey)是否会原生支持这种组织方式……请告诉我。

© . All rights reserved.