如何将ASP.NET网站转换为ASP.NET Web应用程序
我有一个ASP.NET 3.5网站(视觉工作室行话),但该网站继续增长,除了其他事情看起来相当牛仔。 我想看到这被转换成一个Web应用程序(命名空间和所有)。
这是可以在Visual Studio中轻松完成的吗? 如果没有,那里有没有其他的工具可以创build所有的命名空间等automagically?
那么,事实certificate,“转换为Web应用程序”选项不存在“网站”。 “转换为Web应用程序”选项只存在于“Web应用程序”!
[强调我的]
所以,这是交易,做转换,你需要:
添加一个新的“Web应用程序”到你的VS 2008解决scheme(文件 – >添加 – >新build项目 – > C# – > Web-> ASP.NET Web应用程序)。
之后,将旧“网站”中的所有文件复制到新创build的“networking应用程序”中,并默认覆盖默认创build的所有文件
下一步是最丑陋的,你需要“手动”添加你的“网站”引用到新的“networking应用程序”。 我认为VS 2008 PowerCommands玩具会为我做这个,因为它复制了其他项目types的引用,但是它没有。 你必须自己手动完成,如果你有同一个程序集的多个版本(比如我的例子中的AJAXToolkit)或者同时拥有GAC和本地版本的程序集,你必须在这一步谨慎行事。
不断重复最后一步,尝试构build“Web应用程序”。 你会不断收到错误,比如“'….'是未知的命名空间。你是否缺less程序集引用?”。 确保你没有这些,除了那些'…'被你所使用的服务器控件的ID所取代。 换句话说,不断添加引用和构build项目,直到只有因缺less.DESIGNER.CS或.DESIGNER.VB文件而存在的错误。
之后,进入VS 2008解决scheme资源pipe理器中的“Web应用程序”根项目节点,右键单击它,然后您将find“转换为Web应用程序”选项。 这个选项实际上是对页面和控件的“@Page”和“@Control”指令进行了小小的修改,并创build了所需的.DESIGNER.CS或.DESIGNER.VB文件。
尝试再次构build“Web应用程序”。 如果出现错误,请查看可能丢失的参考文献,或者再次单击“转换为Web应用程序”。 有时,如果除了那些由于缺lessDESIGNER文件而导致的错误之外还有其他错误,并不是所有的页面/控件都会为他们创build这些DESIGNER文件。 修复非devise器问题,再次点击“转换为Web应用程序”应该做这个工作。
一旦你成功VSbuild立,你应该准备好去。 开始testing您的Web应用程序。 或者,您可以右键单击VS 2008解决scheme资源pipe理器中的“Web应用程序”根项目节点,然后单击“属性”,然后转到“Web”选项卡,将“Web应用程序”设置为IIS中的虚拟文件夹(您可以创build新的从那里在VS的虚拟目录)。 如果要使用旧的“网站”使用的IIS虚拟目录,则需要先从IIS中删除该目录。
更新:当testing你的页面时,请注意“App_Code”文件夹中的类,特别是那些没有NAMESPACE的类。 那可能是一个很大的陷阱。 在没有命名空间的同一个静态类中,有两个扩展方法重载有问题,一个扩展了DateTime? (可为空),并调用另一个延长DateTime本身的重载。 调用其他重载作为扩展方法通过VS 2008编译,并给我们编译错误只有在运行时(使用IIS)。 改变呼叫到另一个重载调用它作为扩展方法调用它作为正常的静态方法(只改变在同一类中的调用,来自其他类的调用仍然是扩展方法调用)解决了这一个,但显然,这不是就像以前在VS 2005中一样安全。尤其是对于没有名称空间的类。
Update2:在转换过程中,VS 2008将您的“App_Code”重命名为“Old_App_Code”。 这个新名字听起来很难看,但是不要重新命名它。 在“Web应用程序”模型中,所有的代码将在一个程序集中。 在运行时,Web服务器不知道您正在使用的Web项目types。 它将“App_Code”文件夹中的所有代码都创build成一个新的程序集。 这样,如果在名为“App_Code”的文件夹中有代码,那么最终会出现RUNTIME编译错误,即两个程序集中存在相同的types(由VS创build的types),以及由IIS / ASP.NET Development Server 。 为了避免这一点。 保留同名的“Old_App_Code”,或将其重命名为除“App_Code”以外的任何其他名称。 不要在这样的“App_Code”文件夹中放置任何代码,并且在你的“Web应用程序”中根本没有这样的文件夹名称。
我以前知道这一点,但现在忘了它,因为我没有使用长期的“网站”模型:(。
演练:在MSDN上将Visual Studio中的Web站点项目转换为Web应用程序项目
如果您的网站应用程序增长..最好分成几个项目。 从网站项目转换到Web应用程序项目并没有什么帮助。
如果您在获取新的Web应用程序项目时遇到问题,请检查Visual Studio中所有“帮助程序”类的“文件属性”。 对于一个项目,我将Build Action设置为Content,而它应该是Compile。
我最初面临同样的问题。 遵循Wrox专业ASP.NET 4.0的书,我发现我的情况下面的解决scheme。
我首先创build了一个新的Web应用程序。 将所有网站文件复制到Web应用程序文件夹中。 右键单击该应用程序,然后单击转换到Web应用程序。
你可能会问为什么你需要将一个Web应用程序转换成一个Web应用程序。 答案是,当你创build一个网站时,你只需编码.cs文件就可以了。 Web应用程序会自动为代码和devise部分声明.design.cs(或.vb)和.cs文件。
下一步:删除所有的手工引用,如PAGE指令中的“Inherits”属性,将其移动到网站中的其他文件中,因为名称空间将负责集中引用这些类。
我也遇到了一个问题,因为我的项目中没有包含OBJ和BIN文件夹。 如果您认为缺lessBIN和OBJ文件夹,只需单击解决scheme资源pipe理器中的“显示所有文件”图标,然后右键单击缺失的文件夹并添加到项目。 (以确保他们与项目编译。)
更新: @deadlychambers在评论中指出:您可以通过做一个“Ctrl + Shift + F”search到处,然后searchInherits="(.*?)"
。 这将find所有的事件,并可能为您节省一些时间!
在VS 2010中创build一个新的Web应用程序。
1.使用Windows资源pipe理器将所有文件复制到您的项目文件夹中。
在VS 2010解决scheme资源pipe理器中显示所有文件。
3.select文件和文件夹 – 右键单击包含在项目中。
4.右键单击项目解决scheme资源pipe理器并select转换为Web应用程序。
有一些小的差异,如App_Code文件夹将被重命名为old_app_code – 令人惊讶的是不会导致任何错误。 对象数据源上的TypeName和@Page标记上的inheritance可能需要[ProjectName]。 全局附加的前缀。 例如,如果您的types名称为“BusinessLogic.OrderManager”,并且您的项目名称为InventorySystem,则需要将其更改为InventorySystem.BusinessLogic.OrderManager。 还有一些显示更改,如必填字段validation程序不再默认为红色字体,它们默认为黑色。
我现在已经成功地将一个网站项目迁移到一个Web应用程序,并且有一些小技巧需要注意。
使用ReSharper可以帮助您重构aspx文件。
- 设置您的解决scheme并创build一个空的WebApplication
- 复制所有文件
- 网站项目中的aspx文件没有namspace。 将你的类包装在合适的名称空间中
- 在复制过程中,我所有在子文件夹中的页面都被重命名为我的项目名称和文件夹名称,所以我得到了40个
public partial class FolderName_Projectname : Page
如果需要使用Resharper或手动重命名所有文件。 如果您遇到多个错误,例如"There is already a member Page_Load() defined"
,这很可能是由于不正确的类名称和重复 - 添加一个命名空间后
-
用
Codebehind
replace所有aspx页面中的CodeFile
,特别要注意文件在你的子文件夹中。 确保Inhertis=""
不包含相对path。 你的命名空间照顾一切。 所以正确的格式是Inherits="Namespace.classname"
。 如果你的类有一个名字空间NaSpa和一个文件名foo.cs,它将是Inherits="NaSpa.foo"
-
准备好所有文件(不要忘记母版页)后,运行“转换为Web应用程序”。 如果之后遇到错误,请清洗并重复。 如果您遇到错误“TextBoxName无法find你缺less一个参考”,请确保你没有忘记清理你的aspx页面。 一个好的指标是检查自动生成的devise器文件。 如果
TextBoxName
没有出现在那里,转换没有完全成功。 - 解决任何缺less的依赖关系。
- build立
默认的ASP名称空间似乎不再工作。 所以我似乎无法从页面外部调用我的User Controls.ascx页面。 给他们一个命名空间,并改变默认从ASP到我的名字空间似乎工作。