在 Visual Studio 2005 中将网站项目转换为 Web 应用程序项目
2008-10-15 15:01
本 演练说明将现有 Visual Studio 2005 网站项目转换为 Visual Studio 2005 Web 应用程序项目的过程。Web 应用程序项目模型使用与 Visual Studio .NET 2003 中的 Web 项目相同的概念方法。这将包括一个项目文件以将文件和编译包含到单个程序集中,或将它们排除在外。有关 Web 项目转换的更多信息,请参见 自 Visual Studio .NET 的 Web 项目转换。
本演练中阐释的任务包括:
-
打开并验证 Visual Studio 2005 网站项目。
-
创建新的 Visual Studio 2005 Web 应用程序项目。
-
设置项目引用。
-
将文件复制到新的 Web 应用程序项目。
-
转换项目文件。
-
运行 Web 应用程序项目。
-
添加命名空间语法。
-
转换声明性强类型数据集。
-
转换配置文件对象代码。
先决条件
若要完成本演练,您需要:
-
Visual Studio 2005 Service Pack 1 (SP1)
-
.NET Framework 2.0 版
打开并验证 Visual Studio 2005 网站项目
转换项目之前,请打开现有的 Visual Studio 2005 解决方案。编译并运行该解决方案以验证一切都像您希望的那样正常工作。
打开并验证 Visual Studio 2005 Web 项目
-
在“文件”菜单上单击“打开”,再单击“网站”。
-
在“打开网站”对话框中选择要打开的项目文件夹,然后单击“打开”。
-
在“生成”菜单上选择“生成网站”。
-
在“调试”菜单上选择“启动调试”。也可以按 F5。
注意
如果显示“未启用调试”对话框,请选择“添加新的启用了调试的 Web.config 文件”。
-
验证项目是否按预期运行。
创建新的 Visual Studio 2005 Web 应用程序项目
转 换现有 Visual Studio 2005 网站项目的最佳策略是先在单独的目录中创建一个新的空白 Visual Studio 2005 Web 应用程序项目。这样可以避免更改现有网站文件的任何部分,并使您可以将已经实现的功能复制到新的 Web 应用程序项目中。可以将该新项目添加到现有解决方案中(当有若干个要使用的类库项目时,这是理想的选择),也可以启动新的 Visual Studio 实例并在其中创建新的解决方案和项目。
在新解决方案中创建新的 Visual Studio 2005 Web 应用程序项目
-
在 Visual Studio 2005 中,关闭所有已打开的解决方案。
-
在“文件”菜单上单击“新建”,再单击“项目”。“新建项目”对话框随即打开。
-
在“新建项目”对话框的“项目类型”部分中,双击(或展开)要使用的语言,然后选择“Web”以显示与 Web 相关的模板。
-
选择“ASP.NET Web 应用程序”模板。
-
键入要使用的“名称”、“位置”和“解决方案名称”,然后单击“确定”以创建 Web 应用程序项目。
-
创建完项目后,删除 Default.aspx 和 Web.config 文件。
设置项目引用
如果 Visual Studio 2005 网站项目需要其他项目或程序集引用,则可以将它们添加到 Web 应用程序项目中。您会在“解决方案资源管理器”的“引用”节点下看到新建 Visual Studio 2005 Web 应用程序项目的默认引用的列表。
注意
在转换项目文件之前,请为 Bin 文件夹中已存在的程序集添加对 Web 应用程序项目的引用,以防发生错误。
有关引用的更多信息,请参见项目引用。
添加对 Visual Studio 2005 Web 应用程序项目的引用
-
在“解决方案资源管理器”中右击“引用”,再单击“添加引用”。
-
在“添加引用”对话框中选择要添加的引用,再单击“确定”。
-
在“解决方案资源管理器”中右击此 Web 应用程序项目,再单击“生成”。Visual Studio 随即生成此项目,并验证任何项目到项目的引用是否起作用。
将文件复制到此新建 Web 应用程序项目
添 加现有文件最简单的方法就是将文件从 Visual Studio 2005 网站项目复制到此 Web 应用程序项目。在“解决方案资源管理器”中选择网站项目中的所有文件,然后将这些文件复制并粘贴到此新建 Web 应用程序项目中。其目录结构应与网站项目中的目录结构相同。
注意
如果在复制过程中启动了“数据源配置向导”,请在向导的对话框中单击“取消”,并允许复制剩余的文件。
Visual Studio 2005 网站项目与 Visual Studio 2005 Web 应用程序项目之间的一个不同点是:Visual Studio 2005 网站项目模型会动态生成由工具生成的分部类,并且不会将其保留在磁盘上。但是,Visual Studio 2005 Web 应用程序项目模型会将该分部类保存在磁盘上具有 .designer.cs 文件扩展名的文件中。另外,Web 应用程序项目模型会在生成时,使用内存中的 Visual Studio 编译器来编译该分部类。
将文件从网站项目复制到此 Web 应用程序项目之后,您会发现每个页和用户控件的代码隐藏文件仍与 .aspx、.master 和 .ascx 文件相关联的方式。尚未生成 .designer.cs 文件。在下一步中,您将转换这些页以在磁盘上的 .designer.cs 文件中保留它们的分部类声明。
转换项目文件
Visual Studio 包含一个将 Web 应用程序项目中的页和类转换为使用分部类声明的选项。分部类用于将设计器生成的代码与代码隐藏代码分隔开。这些由设计器生成的类都保存在代码隐藏文件之外 的一个单独的文件中。该转换过程会导致 Visual Studio 2005 以递归方式检查项目中的每个页、用户控件和母版页,并自动为每个页、用户控件和母版页生成一个 .designer.cs 文件。Visual Studio 还更改 .aspx 或 .ascx 文件以使用 codeBehind 属性,而不使用 codeFile 属性。此命令还将把 App_Code 文件重命名为 Old_App_Code。
将页和类转换为使用 Web 应用程序项目中的分部类
-
在“解决方案资源管理器”中,右击包含要转换的页和类的项目根文件夹,然后单击“转换为 Web 应用程序”。
将页和类转换为使用分部类后,请生成项目以检查是否出现任何编译错误。发生错误的两个最有可能的原因是:
-
缺少必须添加到项目中的程序集引用。
-
动态生成的类型(如“Profile”对象或强类型数据集)存在问题。
如果缺少程序集引用,则应打开引用管理器并添加它。如果使用动态生成的类型,请参见本主题后面的“转换声明性强类型数据集”和“转换配置文件对象代码”。
注意
如果一个 Visual Basic 类文件包含多个命名空间,请确保在转换后验证每个命名空间。
因 为 ASP.NET 2.0 会在运行时动态编译其在应用程序的 App_Code 目录中找到的任何类,所以不应将作为 Visual Studio 2005 Web 应用程序项目的一部分编译的类保存在 App_Code 文件夹中。如果这么做的话,这样的类将被编译两次:一次作为 Visual Studio 2005 Web 应用程序项目程序集的一部分编译,然后在运行时由 ASP.NET 再次编译。结果将很可能产生 could not load type 运行时异常,出现此异常的原因是应用程序中存在重复的类型名称。相反,应将您的类文件保存在 App_Code 文件夹之外的任何项目文件夹中。“转换为 Web 应用程序”命令将自动处理该操作,该命令会将此文件夹重命名为 Old_App_Code。
运行 Web 应用程序项目
完 成上述步骤后,您就可以在不出任何错误的情况下编译并运行应用程序。默认情况下,Visual Studio 将使用内置 Visual Studio Development Server 运行网站。您也可以将项目配置为使用 Internet 信息服务 (IIS)。若要管理 Web 应用程序项目设置,请右击该项目,再单击“属性”。然后,可以选择“Web”选项卡来配置这些运行时设置。有关 Web 应用程序项目的“Web”选项卡的更多信息,请参见“项目设计器”->“Web”页。
其他转换选项
将项目转换为 Web 应用程序项目时,还需要考虑其他三个转换选项。这些选项为:
-
添加命名空间语法。
-
转换声明性强类型数据集。
-
转换配置文件对象代码。
添加命名空间语法
默 认情况下,使用 Visual Studio 2005 网站项目模型生成的页和类不会自动包含代码命名空间。然而,使用 Visual Studio 2005 Web 应用程序项目模型生成的页、控件和类会自动包含代码命名空间。将网站项目转换为 Web 应用程序项目时,必须向代码添加命名空间。
您可以在 Visual Studio 中使用 C# 代码编辑器中的“外侧代码”快捷菜单命令,轻松地向现有类中的代码添加命名空间。
向现有类添加命名空间
-
在“解决方案资源管理器”中,选择并打开要修改的代码文件。
-
在源编辑器中选择一个类(或多个类),右击所选的代码,然后单击“外侧代码”。
-
在列表中选择“命名空间”项。
请注意,.aspx、.ascx、.master、.ashx、.asmx 和 .asax 文件均包含用于列出它们应调用的类名称的 inherits 或 class 属性。因此,如果向属于这些文件类型的代码隐藏文件添加命名空间,则还必须向 Inherits 和 Class 声明添加此命名空间。例如,如果向上述类型代码隐藏文件添加名为“WebApplication5”的命名空间,则会将 Details.aspx 页的页指令从“inherits=Details_aspx”更改为“inherits=WebApplication5.Details_aspx”。
注意
将网站项目转换为 Web 应用程序项目时,请验证 Page 指令的 Inherits 属性和 CodeFile 属性包含要继承的类的命名空间。
如果必须多次更新文件中的命名空间,则可以使用“编辑”菜单上的“查找和替换”命令来避免逐一更改每个实例。在“查找内容”文本框中,键入 inherits=" 字符串,并在“替换为”框中键入 inherits="WebApplicationName. 字符串,其中“WebApplicationName”是新的命名空间。请确保在替换字符串的末尾加上尾随的句点,因为在替换过程中它将被预置在上一个类名称的前面。
有关如何使用“外侧代码”命令的更多信息,请参见如何:使用外侧代码段。
转换声明性强类型数据集
如果您在 Visual Studio 2005 网站项目的 App_Code 目录中具有强类型 DataSet 类,则必须进行额外的更改以修复 Web.config 文件中的 connectionString。具体来说,您必须在“设计器”中打开每个 DataSet,选择每个 TableAdapter,然后重置对象的 connectionString。
修复强类型 DataSet 的 connectionString
-
在“解决方案资源管理器”中右击 DataSet,然后选择“视图设计器”。“设计器”窗口随即打开。
注意
如果配置了 DataSet 连接,则可以双击 DataSet 以将其显示在“视图设计器”中。
-
右击每个 TableAdapter 并选择“属性”。
-
选择 Connection 属性,然后通过选择一个可用的下拉选项来重置该连接。更新该连接时,也将更新 ConnectionString。
转换配置文件对象代码
ASP.NET 2.0 增加了对名为配置文件个性化的新功能的支持。开发人员使用该功能可以轻松地在个性化数据库中存储和检索用户配置文件数据。对于 Visual Studio 2005 网站项目,ASP.NET 会自动向项目中的每个页添加一个强类型 Profile 对象。此对象提供应用程序的 Web.config 文件的配置文件部分中定义的所有属性的强类型映射。然后,开发人员可以获得该对象的 IntelliSense 数据,并自动在其中保存和检索值。例如,应用程序的 Web.config 文件可能包含以下部分。
type="Teachers"
allowAnonymous="true" />
在这种情况下,开发人员可以将以下代码添加到他们的页中以保存和检索有关“Teachers”对象的信息,如下面的代码示例所示。
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
Teachers teachers = new Teachers();
teachers.Add(new Teacher("Scott"));
teachers.Add(new Teacher("Bob"));
teachers.Add(new Teacher("Paul"));
Profile.Teachers = teachers;
}
protected void Button2_Click(object sender, EventArgs e)
{
GridView1.DataSource = Profile.Teachers;
GridView1.DataBind();
}
}
使用此 Visual Studio 2005 网站项目选项时支持该方案,因为 Visual Studio 会动态创建名为 Profile 的 ProfileCommon 类,并将其添加到每个代码隐藏实例中。
Visual Studio 2005 Web 应用程序项目的 SP1 版本不会自动包含 ProfileCommon 类。因此,需要执行一些额外的步骤来获得 Profile 类的强类型化。具体而言,您可以创建自己的 ProfileCommon 类,该类包含配置文件系统中配置的项目的强类型属性。然后,可以访问 HttpContext 对象的当前 Profile 属性以获取并设置各个属性,如下面的代码示例所示。
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Profile;
namespace WebApplication6
{
public class ProfileCommon
{
public Teachers Teachers
{
get
{
return (Teachers) HttpContext.Current.Profile.GetPropertyValue("Teachers");
}
set
{
HttpContext.Current.Profile.SetPropertyValue("Teachers",value);
}
}
}
}
然后,可以将名为“Profile”的 ProfileCommon 的实例添加到必须使用配置文件系统的页中,如下面的代码示例所示。
namespace WebApplication20
{
public partial class _Default : System.Web.UI.Page
{
ProfileCommon Profile = new ProfileCommon();
protected void Button1_Click(object sender, EventArgs e)
{
Teachers teachers = new Teachers();
teachers.Add(new Teacher("scott"));
teachers.Add(new Teacher("bob"));
teachers.Add(new Teacher("paul"));
Profile.Teachers = teachers;
}
protected void Button2_Click(object sender, EventArgs e)
{
GridView1.DataSource = Profile.Teachers;
GridView1.DataBind();
}
}
}
不必更改页中的其他任何代码。您也可以像处理原始网站项目那样使用配置文件系统。有关如何使用配置文件系统的更多信息,请参见 ASP.NET 配置文件属性概述。