演练:在 Visual Studio 中将网站项目转换为 Web 应用程序项目

更新:2007 年 11 月

本演练介绍如何将现有的 Microsoft Visual Studio 2005 网站项目转换为 Microsoft Visual Studio 2005 Web 应用程序项目。Web 应用程序项目模型使用的概念方法与 Visual Studio .NET 2003 中的 Web 项目相同。该概念方法包括一个项目文件,用于将文件和编译包含到单个程序集中,或将它们排除在外。有关更多信息,请参见 自 Visual Studio .NET 的 Web 项目转换

说明:

可以使用 Visual Studio 或 Visual Web Developer 速成版 创建 ASP.NET Web 应用程序项目。

本演练涉及以下任务:

  • 打开并验证 Visual Studio 2005 网站项目。

  • 创建新的 Visual Studio 2008 Web 应用程序项目。

  • 设置项目引用。

  • 将文件复制到新的 Web 应用程序项目。

  • 转换项目文件。

  • 运行 Web 应用程序项目。

  • 添加命名空间语法。

  • 转换声明性强类型数据集。

  • 转换配置文件对象代码。

系统必备

若要完成本演练,您需要:

  • Visual Studio 2008、Microsoft Visual Studio 2005 Service Pack 1 (SP1) 或 Visual Web Developer 速成版

  • .NET Framework 2.0 版.

打开并验证 Visual Studio 2005 网站项目

转换项目之前,应验证项目是否可以正确运行。这有助于防止在转换期间发生错误。

打开并验证 Visual Studio 2005 Web 项目

  1. 打开现有的 Visual Studio 2005 解决方案。

  2. 在“文件”菜单中单击“打开”,再单击“网站”。

    将显示“打开网站”对话框。

  3. 选择要打开的项目文件夹,然后单击“打开”。

  4. 在“生成”菜单上单击“生成网站”。

  5. 在“调试”菜单中单击“启动调试”。也可以按 F5。

    说明:

    如果显示“未启用调试”对话框,请选择“添加新的启用了调试的 Web.config 文件”。

  6. 验证项目是否按预期运行。

创建新的 Visual Studio 2008 Web 应用程序项目

转换现有 Visual Studio 2005 网站项目的最佳策略是先在单独的目录中创建一个新的空白 Visual Studio 2008 Web 应用程序项目。这样可避免现有网站文件的任何部分发生更改。它还有利于将现有功能复制到新的 Web 应用程序项目中。

您可以将新项目添加到现有解决方案中,当存在多个要使用的类库项目时,这将是理想的方案。另外,也可以启动 Visual Studio 的新实例并创建新的解决方案和项目。

在新解决方案中创建新的 Visual Studio 2008 Web 应用程序项目

  1. 在 Visual Studio 2008 中,关闭所有打开的解决方案。

  2. 在“文件”菜单中单击“新建”,再单击“项目”。

    将显示“新建项目”对话框。

  3. 在“新建项目”对话框的“项目类型”部分中,展开要使用的语言,然后选择“Web”以显示与 Web 相关的模板。

  4. 选择“ASP.NET Web 应用程序”。

  5. 键入“名称”、“位置”和“解决方案名称”的值,然后单击“确定”以创建 Web 应用程序项目。

  6. 创建项目后,请删除自动创建的 Default.aspx 和 Web.config 文件。

设置项目引用

如果 Visual Studio 2008 网站项目需要其他项目或程序集引用,则可以将它们添加到 Web 应用程序项目中。在“解决方案资源管理器”的“引用”节点下,可以看到新 Visual Studio 2008 Web 应用程序项目的默认引用列表。

说明:

若要防止发生错误,请在转换项目文件之前,为 Bin 文件夹中已存在的程序集添加对 Web 应用程序项目的引用。有关如何添加引用的更多信息,请参见以下过程。

有关引用的更多信息,请参见项目引用

添加对 Visual Studio 2008 Web 应用程序项目的引用

  1. 在“解决方案资源管理器”中,右击“引用”,然后单击“添加引用”。

    显示“添加引用”对话框。

  2. 选择要添加的引用,然后单击“确定”。

  3. 在“解决方案资源管理器”中,右击该 Web 应用程序,再单击“生成”。

    Visual Studio 将生成项目,并验证所有项目对项目的引用是否能正常运行。

将文件复制到 Web 应用程序项目中

若要添加现有文件,最简单的方法是将文件从 Visual Studio 2008 网站项目目录复制到 Web 应用程序项目目录。

说明:

如果在复制过程中启动了“数据源配置向导”,请在向导的对话框中单击“取消”,以允许复制剩余的文件。

将网站项目复制到 Web 应用程序项目中

  1. 在“解决方案资源管理器”中,右击网站项目,然后选择“在 Windows 资源管理器中打开文件夹”。

  2. 选择要复制网站项目的文件。

  3. 右击选定的文件,然后选择“复制”。

  4. 在 Web 应用程序项目中,右击该 Web 应用程序项目,然后选择“在 Windows 资源管理器中打开文件夹”。

  5. 将网站项目文件粘贴到 Web 应用程序目录中。

  6. 在 Web 应用程序项目的“解决方案资源管理器”中,单击“显示所有文件”按钮。

  7. 在“解决方案资源管理器”中选择新的文件。

  8. 右击选定的文件,然后单击“包括在项目中”。

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 应用程序项目中的分部类

  1. 在“解决方案资源管理器”中,右击包含要转换的页和类的项目根文件夹,然后单击“转换为 Web 应用程序”。

  2. 生成项目,以查看是否存在任何编译错误。

如果您看到错误,则可以检查两个最常见的原因,如下所述:

  • 缺少必须添加到项目中的程序集引用。

  • 动态生成的类型(例如 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”页

其他转换选项

将项目转换为 Web 应用程序项目时,还需要考虑其他一些转换选项。这些选项如下:

  • 添加命名空间语法。

  • 转换声明性强类型数据集。

  • 转换配置文件对象代码。

添加命名空间语法

默认情况下,使用 Visual Studio 2008 网站项目模型生成的页和类不会自动包含代码命名空间。但是,使用 Visual Studio 2008 Web 应用程序项目模型生成的页、控件和类会自动包含代码命名空间。将网站项目转换为 Web 应用程序项目时,必须向代码添加命名空间。

例如,当您使用 C# 时,可通过 C# 代码编辑器中的“外侧代码”快捷菜单命令向 Visual Studio 中的现有类添加命名空间。

向现有类添加命名空间

  1. 打开要修改的代码文件。

  2. 在源编辑器中选择一个类(或多个类),右击所选的代码,然后单击“外侧代码”。

  3. 在列表中选择“命名空间”项。

扩展名为 .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 编辑器的查找和替换功能。

有关如何使用“外侧代码”命令的更多信息,请参见如何:使用外侧代码段

转换声明性强类型数据集

如果 Visual Studio 2008 网站项目的 App_Code 文件夹中包含强类型数据集类,则还必须执行另一项更改才能修复 Web.config 文件中的 connectionString 元素。此外,还必须为数据集类中的每个 TableAdapter 对象设置 connectionString 元素。

修复强类型数据集的 connectionString

  1. 在“解决方案资源管理器”的 App_Code 文件夹中,右击该数据集类,然后单击“视图设计器”。

    将显示该数据集的“设计器”窗口。

    说明:

    如果已配置数据集连接,则双击数据集即可将其显示在设计器中。

  2. 右击 TableAdapter 对象,然后单击“属性”。

  3. 选择“Connection”属性,然后通过选择一个可用选项来重置该连接。

    更新连接时,连接字符串也将随之更新。

  4. 对于每个数据集中的每个 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();
    }
}

Partial Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        Dim teachers As New Teachers()
        teachers.Add(New Teacher("Scott"))
        teachers.Add(New Teacher("Bob"))
        teachers.Add(New Teacher("Paul"))

        Profile.Teachers = teachers
    End Sub

    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        GridView1.DataSource = Profile.Teachers
        GridView1.DataBind()
    End Sub
End Class

Visual Studio 2008 Web 应用程序项目不会自动包含 ProfileCommon 类。但是,您可以创建自己的 ProfileCommon 类,并在其中包含配置文件系统中已配置项的强类型属性。随后,您可以访问 HttpContext 对象的当前 Profile 属性,以获取并设置这些强类型属性。下面的示例演示如何创建包含在 Class1.cs(对于 Visual Basic 则为 Class1.vb)文件中的自定义 ProfileCommon 类。

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Profile;

namespace WebApplication1
{
    public class ProfileCommon
    {
        public Teachers Teachers
        {
            get
                {
                return (Teachers) HttpContext.Current.Profile.GetPropertyValue("Teachers");
                }
            set
            {
        HttpContext.Current.Profile.SetPropertyValue("Teachers",value);
            }
        }
    }
}

    Imports System 
    Imports System.Collections.Generic 
    Imports System.Text 
    Imports System.Web 
    Imports System.Web.Profile 

    Namespace WebApplication1 
        Public Class ProfileCommon
            Public Property Teachers() As Teachers
                Get
                    Return DirectCast(HttpContext.Current.Profile.GetPropertyValue("Teachers"), Teachers)
                End Get
                Set(ByVal value As Teachers)
                    HttpContext.Current.Profile.SetPropertyValue("Teachers", value)
                End Set
            End Property
        End Class
    End Namespace

接下来,您可以向必须使用配置文件系统的页中添加名为 Profile 的 ProfileCommon 类的一个实例,如下面的示例所示。

    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();
        }
    }

    Public Partial Class _Default 
        Inherits System.Web.UI.Page 
        Public Profile As New ProfileCommon() 
        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) 
            Dim teachers As New Teachers() 
            teachers.Add(New Teacher("scott")) 
            teachers.Add(New Teacher("bob")) 
            teachers.Add(New Teacher("paul")) 
            
            Profile.Teachers = teachers 
        End Sub 
        Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) 
            GridView1.DataSource = Profile.Teachers 
            GridView1.DataBind() 
        End Sub 
    End Class 

您无需更改页上的任何其他代码,即可像在原始网站项目中那样使用配置文件系统。有关更多信息,请参见 ASP.NET 配置文件属性概述

请参见

任务

如何:使用外侧代码段

概念

自 Visual Studio .NET 的 Web 项目转换

项目引用

ASP.NET 配置文件属性概述

参考

“项目设计器”->“Web”页

@ Page