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


90

我有一个ASP.NET 3.5网站(Visual Studio术语),但是该网站继续增长,并且看起来颇为牛仔。我希望看到它转换为Web应用程序(命名空间和所有)。

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


4
与Web应用程序模板相比,该网站模板是一个非常糟糕的POS。我看不到使用网站模板有什么好处...
James

9
@詹姆斯-只是众多原因,我希望从它搬开一个...你是说教合唱团....
RSolberg

2
我确信下面的演练非常彻底(没有读完所有内容),但是youtube上的一个人在这里展示了一种非常简单的方法将网站转换为网络应用:youtube.com/watch?v=oXptokM0v7w-如通常,我不能保证这对每个人都有效。我认为这种方法适用于站点较小,复杂程度较低的人们。
dyslexicanaboko 2012年

3
如果您使用的是VS2013,请不要忘记菜单项已移动
2014年

Answers:


108

好吧,事实证明,“网站”不存在选项“转换为Web应用程序”。仅对“ Web应用程序”存在选项“转换为Web应用程序”!

[强调我的]

因此,这是交易,要进行转换,您需要:

  • 将新的“ Web应用程序”添加到VS 2008解决方案中(文件->添加->新项目-> C#-> Web-> ASP.NET Web应用程序)。

  • 然后,将旧“网站”中的所有文件复制到新创建的“ Web应用程序”中,并覆盖默认情况下在其中创建的所有文件

  • 下一步是最丑的,您需要“手动”将“网站”中的引用添加到新的“ Web应用程序”中。我以为VS 2008 PowerCommands玩具会帮我做这件事,因为它确实会复制其他项目类型的引用,但事实并非如此。您必须手动进行手动操作,并且如果您具有同一程序集的多个版本(例如我的情况下为AJAXToolkit)或同时具有GAC和本地版本的程序集,则在此步骤中必须谨慎。

  • 继续重复最后一步并尝试构建“ Web应用程序”。您将不断收到类似“'....'是未知名称空间的错误。是否缺少程序集引用?”。确保除了“ ....”被您所使用的服务器控件的ID所代替之外,没有其他字符。换句话说,继续添加引用并构建项目,直到仅由于缺少.DESIGNER.CS或.DESIGNER.VB文件而存在的错误为止。

  • 然后,在VS 2008解决方案资源管理器中转到“ Web应用程序”根项目节点,然后右键单击它,然后将找到“转换为Web应用程序”选项。该选项的作用实际上是对页面和控件的“ @Page”和“ @Control”指令进行少量更改,并创建所需的.DESIGNER.CS或.DESIGNER.VB文件。

  • 再次尝试构建“ Web应用程序”。如果您遇到错误,请查看可能缺少的参考和/或再次单击“转换为Web应用程序”。有时,如果除了因缺少DESIGNER文件而引起的错误之外,还有其他错误,则并非所有页面/控件都会为其创建这些DESIGNER文件。解决非DESIGNER问题并再次单击“转换为Web应用程序”应该可以完成此任务。

  • 一旦成功完成VS构建,就应该准备好了。开始测试您的Web应用程序。(可选)您可以在VS 2008解决方案资源管理器中右键单击“ Web应用程序”根项目节点,然后单击“属性”,然后转到“ Web”选项卡以将“ Web应用程序”设置为IIS中的虚拟文件夹(可以创建新的VS中的虚拟目录)。如果要使用旧的“网站”使用的IIS虚拟目录,则需要首先从IIS中删除该目录。

  • 更新:测试页面时,请特别注意“ App_Code”文件夹中的类,尤其是那些没有名称空间的类。这些可能是一个很大的陷阱。我们在没有名称空间的同一静态类中遇到了两个扩展方法重载的问题,一个扩展了DateTime吗?(可空)并调用另一个扩展DateTime本身的重载。调用其他重载作为扩展方法通过了VS 2008编译,并给我们带来了仅在运行时(使用IIS)的编译错误。将对另一个重载的调用从作为扩展方法进行调用更改为作为常规静态方法进行调用(仅更改同一类中的调用,其他类的调用仍保留为扩展方法调用)确实解决了这一问题,但显然,与VS 2005一样安全。

  • Update2:在转换过程中,VS 2008将“ App_Code”重命名为“ Old_App_Code”。这个新名字听起来很难听,但不要重命名。在“ Web应用程序”模型中,所有代码都将在一个程序集中。在运行时,Web服务器不知道您正在使用哪种Web项目类型。它的确吸收了“ App_Code”文件夹中的所有代码,并为其创建了一个新程序集。这样,如果您在名为“ App_Code”的文件夹中包含代码,则将遇到两种类型的程序集中存在相同类型的RUNTIME编译错误:一个由VS创建,一个由IIS / ASP.NET Development Server创建。为了避免这种情况。保留相同名称的“ Old_App_Code”,或将其重命名为“ App_Code”以外的任何名称。不要在“ App_Code”中放置任何代码

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


2
您的链接在顶部断开,错误500
Sameer Alibhai

6
另外,查找要复制为“内容”而不是“编译”的代码文件
jcolebrand 2012年

14
对于在VS2013上执行此操作的人员,“ Covert to Web App”已移至底部的“项目”菜单。
埃里克·萨萨曼

3
@EricSassaman但是对我来说,网站项目根本不存在。
NickG 2014年

1
@NickG,您是正确的,按照答案的第一行,它不存在于网站项目中,除非您在解决方案资源管理器中选择一个Web应用程序,否则项目菜单甚至不存在。如果您在菜单上看到“网站”,则它不是Web应用程序。请按照上述步骤创建一个空白Web应用程序,将文件复制到其中。然后,“转换为Web应用程序”应该在新Web应用程序的项目菜单上。是你做的吗?
埃里克·萨萨曼


5

如果在构建新的Web应用程序项目时遇到问题,请检查Visual Studio中所有“帮助程序”类的“文件属性”。对于一个项目,我正在将“构建操作”设置为“内容”,而应该将其设置为“编译”。


3

在VS 2010中创建一个新的Web应用程序
。1.使用Windows资源管理器将所有文件复制到项目文件夹中。
2.在VS 2010解决方案资源管理器中显示所有文件。
3.选择文件和文件夹-右键单击包含在项目中。
4.右键单击项目解决方案资源管理器,然后选择“转换为Web应用程序”。

有相当小的差异,例如App_Code文件夹将重命名为old_app_code-令人惊讶的是不会引起任何错误。对象数据源上的TypeName和@Page标记上的继承可能需要[ProjectName]。全局附加的前缀。例如,如果您的类型名称为“ BusinessLogic.OrderManager”,而您的项目名称为InventorySystem,则需要将其更改为InventorySystem.BusinessLogic.OrderManager。还有一些显示更改,例如必填字段验证器不再默认为红色字体,而是默认为黑色。


我的应用程序代码文件没有像预期的那样发生变化。我不得不手动重命名它,然后更改所有的cs页面进行编译。
迈克,

3

最初我面临着同样的问题。在遵循Wrox Professional ASP.NET 4.0书之后,我为我的案例找到了以下解决方案。

我首先创建了一个新的Web应用程序。将所有网站文件复制到Web应用程序文件夹中。右键单击该应用程序,然后单击转换为Web应用程序。

您可能会问为什么需要将Web应用程序转换为Web应用程序。答案是,当您创建网站时,只需在任何需要的地方编写.cs文件即可。但是,Web应用程序会自动为代码和设计部分声明.design.cs(或.vb)和.cs文件。

下一步:删除所有手动引用,例如PAGE指令中的'Inherits'属性,到您网站上的其他文件,因为名称空间将负责集中引用类。

我还遇到了一个问题,因为我没有在项目中包含OBJ和BIN文件夹。如果您认为缺少BIN和OBJ文件夹,只需在解决方案资源管理器中单击“显示所有文件”图标,然后右键单击丢失的文件夹并添加到项目中。(以确保它们与项目一起编译。)

更新: 正如@deadlychambers在评论中指出的:您可以通过执行“ Ctrl + Shift + F”在任何地方搜索,然后搜索Inherits="(.*?)"。这将查找所有事件,并可能为您节省一些时间!


1
您可以使用Ctrl-shift-F删除所有内容,然后更改正则表达式的搜索选项并使用此Inherits =“(。*)?”
DeadlyChambers,2014年

1
检查是否是Inherits =“(。*?)”,另一个将抓住继承中的所有内容,直到最后一个引号为止。
DeadlyChambers 2014年

1
我只是遇到了一个问题,即没有继承导致设计人员先删除命名空间,然后再删除类。我希望这会更容易。
DeadlyChambers 2014年

3

现在,我已经成功地将一个“网站”项目迁移到了一个Web应用程序,这里有一些需要注意的地方。

拥有ReSharper可以帮助您重构aspx文件。

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

  7. 准备好所有文件后(不要忘记母版页),运行“转换为Web应用程序”。如果之后遇到错误,请冲洗并重复。如果遇到错误“缺少引用,则找不到TextBoxName”,请确保您没有忘记清理aspx页面。一个很好的指示是检查自动生成的设计器文件。如果TextBoxName未出现在其中,则转换未完全成功。

  8. 解决所有丢失的依赖项。
  9. 建立

0

默认的ASP名称空间似乎不再起作用。因此,我似乎无法从页面外部调用User Controls.ascx页面。给他们一个名称空间并将默认值从ASP更改为我的名称空间似乎可行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.