我有一个ASP.NET 3.5网站(Visual Studio术语),但是该网站继续增长,并且看起来颇为牛仔。我希望看到它转换为Web应用程序(命名空间和所有)。
这可以在Visual Studio中轻松完成吗?如果不是,是否有其他工具可以自动创建所有名称空间等?
我有一个ASP.NET 3.5网站(Visual Studio术语),但是该网站继续增长,并且看起来颇为牛仔。我希望看到它转换为Web应用程序(命名空间和所有)。
这可以在Visual Studio中轻松完成吗?如果不是,是否有其他工具可以自动创建所有名称空间等?
Answers:
好吧,事实证明,“网站”不存在选项“转换为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”中放置任何代码
我从很早以前就知道这一点,但是现在忘记了,因为我已经很长时间没有使用“网站”模型了:(。
如果您的网站应用程序增长了,最好将其拆分为多个项目。从网站项目到Web应用程序项目的转换不会有太大帮助。
在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。还有一些显示更改,例如必填字段验证器不再默认为红色字体,而是默认为黑色。
最初我面临着同样的问题。在遵循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="(.*?)"
。这将查找所有事件,并可能为您节省一些时间!
现在,我已经成功地将一个“网站”项目迁移到了一个Web应用程序,这里有一些需要注意的地方。
拥有ReSharper可以帮助您重构aspx文件。
public partial class FolderName_Projectname : Page
如果需要)使用Resharper或手动重命名所有文件。如果您遇到多个错误,例如"There is already a member Page_Load() defined"
,这很可能是由于错误的类名和重复项引起的CodeFile
在所有aspx页中替换为Codebehind
,尤其要注意子文件夹中的文件。确保Inhertis=""
不包含相对路径。您的名称空间会处理所有事情。因此正确的格式是Inherits="Namespace.classname"
。如果您的类具有名称空间NaSpa和文件名foo.cs,则它将为Inherits="NaSpa.foo"
准备好所有文件后(不要忘记母版页),运行“转换为Web应用程序”。如果之后遇到错误,请冲洗并重复。如果遇到错误“缺少引用,则找不到TextBoxName”,请确保您没有忘记清理aspx页面。一个很好的指示是检查自动生成的设计器文件。如果TextBoxName
未出现在其中,则转换未完全成功。