如何将ASP.NET网站转换为ASP.NET Web应用程序。

96

我有一个ASP.NET 3.5网站(Visual Studio术语),但是该网站不断增长,看起来相当混乱。我希望将其转换为Web应用程序(包括命名空间等)。

这在Visual Studio中是否可以轻松完成?如果不能,是否有其他工具可以自动创建所有命名空间等?


4
那个网站模板与Web应用程序模板相比真的很糟糕。我无法看出使用网站模板有任何好处... - James
10
@ James - 我正在寻找搬离这里的原因之一...... 你说的我早已明白。 - RSolberg
2
我相信下面的步骤非常详细(没有全部阅读),但是YouTube上的一个人展示了一种非常简单的方法将网站转换为Web应用程序,链接在这里:http://www.youtube.com/watch?v=oXptokM0v7w - 像往常一样,我不能保证这对每个人都有效。我认为这种方法适用于规模较小、不太复杂的网站。 - dyslexicanaboko
3
如果您正在使用VS2013,请注意菜单项已经移动 - Jon
7个回答

113
好的,事实证明,“转换为Web应用程序”选项并不存在于“网站”中。该选项仅存在于“Web应用程序”中!所以,要进行转换,你需要:
  • 向你的VS2008解决方案添加一个新的“Web应用程序”(文件->添加->新建项目->C#->Web->ASP.NET Web应用程序)。

  • 之后,将旧“网站”中的所有文件复制到你新创建的“Web应用程序”中,并覆盖其中默认创建的任何文件。

  • 下一步是最困难的,你需要在你的“网站”中“手动”添加到新的“Web应用程序”的引用。我以为VS2008 PowerCommands工具会像它从其他项目类型中复制引用一样帮我完成这个,但它没有。你必须自己手动完成,并且在这一步骤中必须小心,特别是如果你有多个版本的同一程序集(如我的AJAXToolkit)或既有GAC版本又有本地版本的程序集等。

  • 重复上一步并尝试构建“Web应用程序”。你会不断收到像“'....'未知命名空间。是否缺少程序集引用?”这样的错误提示。请确保只有使用服务器控件ID替换'....'时,你没有缺少引用。换句话说,不断添加引用并构建项目,直到只存在由于缺少.DESIGNER.CS或.DESIGNER.VB文件而出现的错误提示。

  • 之后,进入VS2008解决方案资源管理器中的“Web应用程序”根项目节点,并右键单击它,选择“转换为Web应用程序”。在弹出的对话框中,确保选中“当前解决方案中的所有内容”,然后单击“确定”进行转换。这时,你就将“网站”转换成了一个“Web应用程序”!

请点击它,然后您将找到选项“转换为Web应用程序”。该选项实际上是对页面和控件的“@Page”和“@Control”指令进行了一些小修改,并创建所需的.DESIGNER.CS或.DESIGNER.VB文件。
尝试再次构建“Web应用程序”。如果出现错误,请查看可能缺少哪些引用并/或再次单击“转换为Web应用程序”。有时,除了由于缺少DESIGNER文件而引起的错误之外,不是所有页面/控件都会为它们创建这些DESIGNER文件。修复非DESIGNER问题并再次单击“转换为Web应用程序”即可解决此问题。
完成成功的VS生成后,您应该准备好开始测试Web应用程序了。可选地,您可以右键单击VS 2008解决方案资源管理器中的“Web应用程序”根项目节点,然后单击“属性”,然后转到“Web”选项卡,将“Web应用程序”设置为IIS中的虚拟文件夹(您可以在其中创建新的虚拟目录)。如果要使用旧“网站”使用的IIS虚拟目录,则需要首先从IIS中删除该目录。
更新:在测试页面时,请特别注意“App_Code”文件夹中的类,尤其是那些没有命名空间的类。它们可能会成为一个大陷阱。我们曾经遇到过一个问题,即在同一个静态类中没有命名空间的两个扩展方法重载,其中一个是扩展DateTime?(可空)并调用另一个重载,该重载扩展DateTime本身。将其他重载作为扩展方法调用通过了VS 2008编译,并在运行时(使用IIS)仅给了我们一个编译错误。将调用从扩展方法更改为正常静态方法的其他重载(仅更改来自其他类的调用)解决了该问题。其他类仍然是扩展方法的调用,解决了这个问题,但很明显,在VS 2005中不像以前那样安全。特别是对于没有命名空间的类。

  • 更新2:在转换过程中,VS 2008会将您的“App_Code”重命名为“Old_App_Code”。这个新名称听起来很丑陋,但请不要将其改回。在“Web应用程序”模型中,所有代码都将位于一个程序集中。在运行时,Web服务器不知道您正在使用哪种Web项目类型。它会获取“App_Code”文件夹中的所有代码并为其创建一个新的程序集。这样,如果您有一个名为“App_Code”的文件夹中的代码,您将遇到运行时编译错误,因为同一类型存在于由VS创建的程序集和由IIS/ASP.NET开发服务器创建的程序集中。为了避免这种情况,请将“Old_App_Code”保留为相同的名称,或将其重命名为除“App_Code”之外的任何名称。不要将任何代码放入此类“App_Code”文件夹中,并且最好根本不要在您的“Web应用程序”中拥有此类名称的文件夹。

  • 我早就知道这一点,但现在已经忘记了,因为我很长时间没有使用“网站”模型了 :(。


    2
    你的链接在顶部出现了问题,错误代码500。 - Sameer Alibhai
    6
    另外,要查找代码文件以作为“内容”而不是“编译”进行复制。 - jcolebrand
    18
    对于那些在VS2013上进行此操作的人,“转换为Web应用程序”已移至项目菜单底部。 - Eric Sassaman
    3
    @EricSassaman,但对于网站项目来说,我根本找不到它。 - NickG
    1
    我正在使用VS2017进行此操作。我想添加两个要点。从上面的第2点 - 复制文件,我必须先在VS中创建文件夹,然后选择添加现有项。我从网站中选择,然后文件被复制到Web应用程序项目中。在第4点之后,如果我没有看到任何缺失的引用,也没有看到任何错误抱怨缺少设计文件。我从项目->转换为Web应用程序中进行选择。 - Just a HK developer
    显示剩余5条评论

    15

    6
    如果您在构建新的Web应用程序项目时遇到问题,请检查Visual Studio中所有“helper”类的文件属性。对于我要转换的项目,生成操作设置为内容(Build Action设置为Content),而应该设置为编译(Compile)。

    5

    我已经成功将一个网站项目迁移到了Web应用程序,需要注意一些问题。

    使用ReSharper可以帮助您重构aspx文件。

    1. 设置解决方案并创建空的WebApplication。
    2. 复制所有文件。
    3. Website项目中的aspx文件没有命名空间。将您的类包装在适当的命名空间中。
    4. 在复制过程中,所有子文件夹中的页面都被重命名为我的项目名称和文件夹名称,因此我有40多个 public partial class FolderName_Projectname : Page 如果必要,使用Resharper或手动重命名所有文件。 如果遇到多个类似于 "There is already a member Page_Load() defined" 的错误,则很可能是由于类名不正确或重复造成的。
    5. 添加命名空间后,
    6. 在所有aspx页面中将CodeFile替换为Codebehind,特别注意子文件夹中的文件。确保Inhertis = ""不包含相对路径。您的命名空间会处理所有事情。因此,正确的格式是Inherits="Namespace.classname"。 如果您的类具有命名空间NaSpa和文件名foo.cs,则为Inherits="NaSpa.foo"

    7. 在准备好所有文件之后(不要忘记主页面),运行“转换为Web应用程序”。如果之后遇到错误,请反复执行此操作。 如果遇到类似于“TextBoxName找不到,您是否缺少引用”的错误,请确保没有忘记对aspx页面进行消毒。一个很好的指标是检查自动生成的设计者文件。如果TextBoxName在其中没有出现,则转换未完全成功。

    8. 解决任何丢失的依赖项。
    9. 构建。

    3
    在VS 2010中创建新的Web应用程序。
    1.使用Windows资源管理器将所有文件复制到您的项目文件夹中。
    2.在VS 2010解决方案资源管理器中显示所有文件。
    3.选择文件和文件夹-右键单击包括在项目中。
    4.右键单击项目解决方案资源管理器,选择转换为Web应用程序。
    有一些小的区别,例如App_Code文件夹将被重命名为old_app_code-令人惊讶的是这不会引起任何错误。您对象数据源的TypeName和@Page标记上的inherits可能需要添加[ProjectName]前缀。例如,如果您的类型名称为“BusinessLogic.OrderManager”,而您的项目名称为InventorySystem,则需要将其更改为InventorySystem.BusinessLogic.OrderManager。还有一些显示更改,例如必填字段验证器不再默认为红色字体,而是默认为黑色。

    我的应用程序代码文件没有像预期的那样更改。我不得不手动重命名它,然后更改所有CS页面以进行编译。 - Mike

    3
    我最初也遇到了相同的问题。在阅读Wrox Professional ASP.NET 4.0书后,我找到了适用于我的情况的以下解决方案。
    首先,我创建了一个新的Web应用程序。将所有网站文件复制到Web应用程序文件夹中。右键点击应用程序,然后单击转换为Web应用程序。
    你可能会问为什么需要将Web应用程序转换为Web应用程序。答案是,当你创建一个网站时,你只需在必要的地方编写.cs文件。而Web应用程序会自动声明.design.cs(或.vb)和一个.cs文件来分别处理代码和设计部分。
    接下来:删除所有手动引用,如页面指令中的“Inherits”属性,以及其他网站文件,因为名称空间将负责集中引用类。
    我也遇到了一个问题,因为我没有将OBJ和BIN文件夹包含在我的项目中。如果你认为你缺少BIN和OBJ文件夹,只需在“解决方案资源管理器”中单击“显示所有文件”图标,然后右键单击缺失的文件夹并添加到项目中(确保它们与项目一起编译)。
    更新: 正如@deadlychambers在评论中指出的那样:你可以通过执行“Ctrl + Shift + F”,然后搜索

    1
    你可以使用Ctrl-shift-F删除所有内容,然后更改搜索选项为正则表达式,并使用此Inherits="(.*)?"。 - DeadlyChambers
    1
    检查是否为 Inherits="(.*?)",另一个将获取 Inherits 后面的所有内容直到最后一个引号。 - DeadlyChambers
    1
    我遇到了一个问题,没有使用inherits导致设计师删除命名空间,然后又删除了类。但愿这能更容易些。 - DeadlyChambers

    0

    默认的ASP命名空间似乎不再起作用了。因此,我无法从页面外部调用我的用户控件.ascx页面。给它们一个命名空间并将默认值从ASP更改为我的命名空间似乎可以解决问题。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接