在 Visual Studio 中将网站项目转换为 Web 应用程序项目
要完成转换操作要进行以下步骤:
-
打开并验证 Visual Studio 2005 网站项目。
-
创建新的 Visual Studio 2008 Web 应用程序项目。
-
设置项目引用。
-
将文件复制到新的 Web 应用程序项目。
-
转换项目文件。
-
运行 Web 应用程序项目。
-
添加命名空间语法。
-
转换声明性强类型数据集。
-
转换配置文件对象代码。
若要完成转换,您需要:
-
Visual Studio 2008 或 Microsoft Visual Studio 2005 Service Pack 1 (SP1)
-
.NET Framework 2.0 版。
转换项目之前,应验证项目是否可以正确运行。这有助于防止在转换期间发生错误。
打开并验证 Visual Studio 2005 Web 项目
-
打开现有的 Visual Studio 2005 解决方案。
-
在“文件”菜单中单击“打开”,再单击“网站”。
将显示“打开网站”对话框。
-
选择要打开的项目文件夹,然后单击“打开”。
-
在“生成”菜单上单击“生成网站”。
-
在“调试”菜单中单击“启动调试”。也可以按 F5。
-
验证项目是否按预期运行。
-
创建新的 Visual Studio 2008 Web 应用程序项目
转换现有 Visual Studio 2005 网站项目的最佳策略是先在单独的目录中创建一个新的空白 Visual Studio 2008 Web 应用程序项目。这样可避免现有网站文件的任何部分发生更改。它还有利于将现有功能复制到新的 Web 应用程序项目中。
您可以将新项目添加到现有解决方案中,当存在多个要使用的类库项目时,这将是理想的方案。另外,也可以启动 Visual Studio 的新实例并创建新的解决方案和项目。
在新解决方案中创建新的 Visual Studio 2008 Web 应用程序项目
-
在 Visual Studio 2008 中,关闭所有打开的解决方案。
-
在“文件”菜单中单击“新建”,再单击“项目”。
将显示“新建项目”对话框。
-
在“新建项目”对话框的“项目类型”部分中,展开要使用的语言,然后选择“Web”以显示与 Web 相关的模板。
-
选择“ASP.NET Web 应用程序”。
-
键入“名称”、“位置”和“解决方案名称”的值,然后单击“确定”以创建 Web 应用程序项目。
-
创建项目后,请删除自动创建的 Default.aspx 和 Web.config 文件。
将网站项目复制到 Web 应用程序项目中
-
在“解决方案资源管理器”中,右击网站项目,然后选择“在 Windows 资源管理器中打开文件夹”。
-
选择要复制网站项目的文件。
-
右击选定的文件,然后选择“复制”。
-
在 Web 应用程序项目中,右击该 Web 应用程序项目,然后选择“在 Windows 资源管理器中打开文件夹”。
-
将网站项目文件粘贴到 Web 应用程序目录中。
-
在 Web 应用程序项目的“解决方案资源管理器”中,单击“显示所有文件”按钮。
-
在“解决方案资源管理器”中选择新的文件。
-
右击选定的文件,然后单击“包括在项目中”。
Visual Studio 2008 网站项目与 Visual Studio 2008 Web 应用程序项目的一个区别是,网站项目模型会动态生成由工具生成的分部类。
将文件从网站项目复制到 Web 应用程序项目之后,您会发现每个页和用户控件的代码隐藏文件仍与 .aspx、.master 和 .ascx 文件关联。此过程并未生成 .designer.cs 或 .designer.vb 文件。在下一步中,您要转换这些页,以便将其分部类保存在 .designer.cs 或 .designer.vb 文件中。
转换项目文件
Visual Studio 包括一个用于转换 Web 应用程序项目中的页和类以使用其分部类的选项。分部类用于分隔页或用户控件代码隐藏代码中的标记。这些由设计器生成的类都保存在代码隐藏文件之外的一个单独的文件中。
在转换过程中,Visual Studio 2008 将以递归方式检查项目中的每个页、母版页和用户控件,并自动为它们中的每一项生成一个 .designer.cs 文件。此外,Visual Studio 还会更改 .aspx 或 .ascx 文件,以使用 codeBehind 属性代替 codeFile 属性。此命令还会将 App_Code 文件夹重命名为 Old_App_Code。
将页和类转换为使用 Web 应用程序项目中的分部类
-
在“解决方案资源管理器”中,右击包含要转换的页和类的项目根文件夹,然后单击“转换为 Web 应用程序”。
-
生成项目,以查看是否存在任何编译错误。
如果您看到错误,则可以检查两个最常见的原因,如下所述:
-
缺少必须添加到项目中的程序集引用。
-
动态生成的类型(例如 Profile 对象或类型化数据集)存在问题。
如果缺少程序集引用,请打开引用管理器并进行添加。如果使用的是动态生成的类型,请参见本主题后面的“转换声明性强类型数据集” 和“转换配置文件对象代码”。
由于 ASP.NET 2.0 会动态编译 App_Code 文件夹中的所有类,因此不应将编译为 Visual Studio 2008 Web 应用程序的一部分的类存储在该文件夹中。否则,该类将被编译两次。第一次将作为 Visual Studio 2008 Web 应用程序项目程序集的一部分编译,第二次则是由 ASP.NET 在运行时编译。这可能导致“未能加载类型”异常。之所以出现此异常,是因为应用程序中存在重复的类型名称。
正确的方法应是将类文件存储在 App_Code 文件夹之外的项目文件夹中。此操作是通过“转换为 Web 应用程序”命令自动完成的,此命令可将该文件夹重命名为 Old_App_Code。
运行 Web 应用程序项目
现在可以编译并运行应用程序。默认情况下,Visual Studio 2008 将使用内置的 ASP.NET Development Server 运行网站。您也可以将项目配置为使用 Internet 信息服务 (IIS)。若要管理 Web 应用程序项目设置,请右击该项目,再单击“属性”。随后,可以选择“Web”选项卡来配置这些运行时设置。
其他转换选项
将项目转换为 Web 应用程序项目时,还需要考虑其他一些转换选项。这些选项如下:
-
添加命名空间语法。
-
转换声明性强类型数据集。
-
转换配置文件对象代码。
添加命名空间语法
默认情况下,使用 Visual Studio 2008 网站项目模型生成的页和类不会自动包含代码命名空间。但是,使用 Visual Studio 2008 Web 应用程序项目模型生成的页、控件和类会自动包含代码命名空间。将网站项目转换为 Web 应用程序项目时,必须向代码添加命名空间。
例如,当您使用 C# 时,可通过 C# 代码编辑器中的“外侧代码”快捷菜单命令向 Visual Studio 中的现有类添加命名空间。
向现有类添加命名空间
-
打开要修改的代码文件。
-
在源编辑器中选择一个类(或多个类),右击所选的代码,然后单击“外侧代码”。
-
在列表中选择“命名空间”项。
扩展名为 .aspx、.ascx、.master、.ashx、.asmx 和 .asax 的文件包含带有 Inherits 或 Class 属性的指令(例如 @ Page 指令),当这些文件是代码隐藏页时,上述属性将列出它们调用的类名。如果向属于这些文件类型的代码隐藏文件中添加了命名空间,则还必须将该命名空间添加到 Inherits 和 Class 声明中。例如,如果向名为 Details.aspx 的代码隐藏文件中添加 WebApplication5 命名空间,则还需要将 @ Page 指令的 Inherits 属性从 inherits=Details_aspx 更改为 inherits=WebApplication5.Details_aspx。
转换声明性强类型数据集
如果 Visual Studio 2008 网站项目的 App_Code 文件夹中包含强类型数据集类,则还必须执行另一项更改才能修复 Web.config 文件中的 connectionString 元素。此外,还必须为数据集类中的每个 TableAdapter 对象设置 connectionString 元素。
修复强类型数据集的 connectionString
-
在“解决方案资源管理器”的 App_Code 文件夹中,右击该数据集类,然后单击“视图设计器”。
将显示该数据集的“设计器”窗口。
-
右击 TableAdapter 对象,然后单击“属性”。
-
选择“Connection”属性,然后通过选择一个可用选项来重置该连接。
更新连接时,连接字符串也将随之更新。
-
对于每个数据集中的每个 TableAdapter 对象,请重复上述步骤。
转换配置文件对象代码
ASP.NET 2.0 增加了对配置文件属性的支持。利用此功能,可以在个性化数据库中存储和检索用户配置文件数据。在 Visual Studio 2008 网站项目中,ASP.NET 会自动向项目中的每个 ASP.NET 网页添加一个 Profile 对象(ProfileCommon 类的实例)。此对象可对应用程序 Web.config 文件的 profile 节中所定义的全部属性提供强类型访问。您可以获取此对象的 IntelliSense 数据,并自动在其中保存和检索值。
例如,应用程序的 Web.config 文件可能包含以下部分。
<profile defaultProvider="AspNetSqlProfileProvider"> <properties> <add name="Teachers" type="Teachers" allowAnonymous="true" /> </properties> </profile>
在此情况下,可以向页中添加以下代码,以保存并检索有关 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 2008 Web 应用程序项目不会自动包含 ProfileCommon 类。但是,您可以创建自己的 ProfileCommon 类,并在其中包含配置文件系统中已配置项的强类型属性。随后,您可以访问 HttpContext 对象的当前 Profile 属性,以获取并设置这些强类型属性。下面的示例演示如何创建一个自定义 ProfileCommon 类。
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(); } } }
您无需更改页上的任何其他代码,即可像在原始网站项目中那样使用配置文件系统。