如何将 ASP.NET 网站转换为 ASP.NET Web 应用程序
Posted
技术标签:
【中文标题】如何将 ASP.NET 网站转换为 ASP.NET Web 应用程序【英文标题】:How to convert ASP.NET website to ASP.NET web application 【发布时间】:2010-10-18 14:46:23 【问题描述】:我有一个 ASP.NET 3.5 网站(visual studio lingo),但该网站还在不断发展壮大,而且看起来相当牛仔。我希望看到它被转换成一个 Web 应用程序(命名空间和所有)。
这是可以在 Visual Studio 中轻松完成的事情吗?如果没有,是否还有其他工具可以自动创建所有命名空间等?
【问题讨论】:
与 Web 应用程序模板相比,该网站模板是一个非常糟糕的 POS。我看不到使用网站模板的任何好处... @James - 这只是我希望摆脱它的众多原因之一......你正在向合唱团布道...... 我确信下面的演练非常彻底(没有阅读全部内容),但是 youtube 上的一个人在这里展示了一种将网站转换为网络应用程序的非常简单的方法:youtube.com/watch?v=oXptokM0v7w - 像往常一样,我不能保证这对每个人都有效。我认为这种方法适用于网站较小且不太复杂的人。 如果你用的是VS2013,别忘了the menu item has moved。 【参考方案1】:好吧,事实证明“网站”不存在“转换为 Web 应用程序”选项。 “转换为 Web 应用程序”选项确实仅适用于“Web 应用程序”!!!!
[强调我的]
所以,这就是交易,做 转换,您需要:
将新的“Web 应用程序”添加到您的 VS 2008 解决方案(文件->添加->新建 项目->C#->Web->ASP.NET Web 申请)。
然后,将旧“网站”中的所有文件复制到新的 创建了“网络应用程序”,并且 覆盖其中创建的任何文件 默认
下一步最难看,需要“手动”添加引用 在你的“网站”到新的“网站” 应用程序”。我认为 VS 2008 PowerCommands 玩具会为我做这件事 因为它确实复制了其他人的参考资料 项目类型,但它没有。你有 自己做,手动,和 在这一步你必须小心 如果您有多个版本的 相同的程序集(比如我的 AJAXToolkit case) 或同时具有 GAC 的程序集 和本地版本左右。
继续重复最后一步并尝试构建“Web 应用程序”。 您将不断收到类似“ '....' 是未知的命名空间。你是 缺少程序集参考? “。 制作 确保你没有这些,除了 '....' 被替换为 您使用的服务器控件的 ID。在 换句话说,继续添加参考 并构建项目,直到 由于存在的错误 缺少 .DESIGNER.CS 或 .DESIGNER.VB 文件。
之后,进入VS中的“web应用”根项目节点 2008 解决方案资源管理器,对 点击它,然后你会找到 选项“转换为 Web 应用程序”。 这个选项实际上是 对“@Page”进行小改动 和页面的“@Control”指令和 控件,并创建所需的 .DESIGNER.CS 或 .DESIGNER.VB 文件。
再次尝试构建“Web 应用程序”。如果你得到错误,看看什么 参考可能丢失和/或消失 单击“转换为 Web 应用程序” 再次。有时,如果有任何错误 失踪造成的除外 DESIGNER 文件,并非所有 页面/控件将具有那些 为他们创建的 DESIGNER 文件。 修复非 DESIGNER 问题和 单击“转换为 Web 应用程序” 再次应该为此做这项工作。
一旦你完成了成功的 VS 构建,你应该准备好了。 开始测试您的 Web 应用程序。 或者,您可以右键单击 “Web 应用程序”根项目节点位于 VS 2008 解决方案资源管理器并单击 “属性”然后转到选项卡“Web” 将“Web 应用程序”设置为 IIS 中的虚拟文件夹(您可以创建 新的虚拟目录从那里 VS)。如果你想使用 IIS 旧的虚拟目录 使用“网站”,您需要删除 首先来自 IIS。
更新:在测试您的页面时,请务必注意 “App_Code”文件夹,尤其是那些 没有命名空间。这些可能很大 陷阱。我们有两个问题 扩展方法重载在同一 没有命名空间的静态类,一个 延长日期时间? (可以为空) 并调用另一个重载 扩展 DateTime 本身。调用 其他重载作为扩展方法 通过 VS 2008 编译并给了我们 仅在运行时出现编译错误 (使用 IIS)。将呼叫更改为 其他重载将其称为 将其称为的扩展方法 普通静态方法(仅更改 同一个班级的电话,来自 其他类保持扩展 方法调用)确实解决了这个问题,但是 显然,它不像以前那样安全 要在 VS 2005 中。尤其是与 没有命名空间的类。
Update2:在转换过程中,VS 2008 将您的“App_Code”重命名为 “Old_App_Code”。这个新名字听起来 丑陋,但不要重命名它。在 “Web 应用程序”模型,所有代码 将在一个程序集中。在运行时, 网络服务器不知道什么网络 您正在使用的项目类型。它确实 获取“App_Code”文件夹中的所有代码,然后 为它创建一个新程序集。这 方式,如果您在名为的文件夹中有代码 “App_Code”,你最终会得到 RUNTIME 相同类型的编译错误 存在于两个程序集中,一个 由 VS 创建的,由 VS 创建的 IIS/ASP.NET 开发服务器。到 避免这种情况。留下“Old_App_Code” 使用相同的名称,或将其重命名为 除了:“App_Code”之外的任何内容。不要 将任何代码放在这样的“App_Code”中 文件夹,最好没有 在您的“网络”中具有此类名称的文件夹 应用程序”。
我以前就知道,但忘记了 现在因为我没有使用“网站”模型 很长一段时间:(。
【讨论】:
您的链接在顶部已损坏,错误 500 另外,寻找要作为“内容”而不是“编译”复制的代码文件 对于那些在 VS2013 上执行此操作的人,“隐藏到 Web 应用程序”已移至底部的“项目”菜单。 @EricSassaman 但对我来说,网站项目根本不存在。 @NickG,你是对的,根据答案的第一行,网站项目不存在,除非你在解决方案资源管理器中选择一个 Web 应用程序,否则项目菜单甚至不存在.如果您在菜单上看到“网站”,则它不是 Web 应用程序。按照上述步骤创建一个空白 Web 应用程序,将文件复制到其中。然后“转换为 Web 应用程序”应该在您的新 Web 应用程序的项目菜单上。你这样做了吗?【参考方案2】:Walkthrough: Converting a Web Site Project to a Web Application Project in Visual Studio 在 MSDN 上
如果您的网站应用程序增长.. 最好将其拆分为多个项目。从 Web 站点项目转换为 Web 应用程序项目并没有多大帮助。
【讨论】:
【参考方案3】:如果您在构建新的 Web 应用程序项目时遇到问题,请检查 Visual Studio 中所有“帮助程序”类的文件属性。对于我正在转换的项目,构建操作设置为内容,而它应该是编译。
【讨论】:
【参考方案4】:我现在已经成功地将一个网站项目迁移到了一个 Web 应用程序,并且有一些问题需要注意。
使用 ReSharper 对重构 aspx 文件有很大帮助。
-
设置您的解决方案并创建一个空的 WebApplication
复制所有文件
网站项目中的aspx 文件没有命名空间。将您的类包装在适当的命名空间中
在复制过程中,我在子文件夹中的所有页面都重命名为我的项目名称和文件夹名称,所以我得到了 40ish
public partial class FolderName_Projectname : Page
如果需要使用 Resharper 或手动重命名所有文件。
如果您遇到多个错误,例如"There is already a member Page_Load() defined"
,这很可能是由于错误的类名和重复
添加命名空间后
将所有 aspx 页面中的 CodeFile
替换为 Codebehind
,并特别注意子文件夹中的文件。确保Inhertis=""
不包含相对路径。您的命名空间会处理一切。所以正确的格式是Inherits="Namespace.classname"
。
如果你的类有一个命名空间 NaSpa 和一个文件名 foo.cs 它将是 Inherits="NaSpa.foo"
准备好所有文件后(不要忘记母版页),运行“转换为 Web 应用程序”。如果之后遇到错误,请冲洗并重复。
如果您遇到“找不到 TextBoxName 是否缺少参考”之类的错误,请确保您没有忘记清理您的 aspx 页面。一个好的指标是检查自动生成的设计器文件。如果那里没有出现TextBoxName
,则说明转换没有完全成功。
【讨论】:
【参考方案5】:在 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 页面进行编译。【参考方案6】:我最初也面临同样的问题。在遵循 Wrox Professional ASP.NET 4.0 书籍后,我找到了适合我的案例的以下解决方案。
我首先创建了一个新的 Web 应用程序。将所有网站文件复制到 Web 应用程序文件夹中。右键单击应用程序,然后单击转换为 Web 应用程序。
您可能会问为什么需要将网络应用程序转换为网络应用程序。答案是,当您创建一个网站时,您只需在需要的地方编写 .cs 文件即可。 但是,Web 应用程序会自动为代码和设计部分声明 .design.cs(或 .vb)和 .cs 文件。
下一步:删除所有手动引用,例如 PAGE 指令中的“继承”属性,对您网站中的其他文件,因为名称空间将负责集中引用这些类。
我也遇到了一个问题,因为我的项目中没有包含 OBJ 和 BIN 文件夹。 如果您认为您丢失了 BIN 和 OBJ 文件夹,只需单击解决方案资源管理器中的“显示所有文件”图标,然后右键单击丢失的文件夹并添加到项目。 (以确保它们与项目一起编译。)
更新:
正如@deadlychambers 在 cmets 中指出的那样:您可以通过执行“Ctrl + Shift + F”搜索任何地方,然后搜索 Inherits="(.*?)"
。这将找到所有出现的情况,并可能为您节省一些时间!
【讨论】:
您可以使用 Ctrl-shift-F 删除所有内容,然后更改正则表达式的搜索选项并使用此 Inherits="(.*)?" 检查是否是 Inherits="(.*?)" 另一个将抓取继承后面的所有内容,直到最后一个引号。 我刚遇到一个问题,没有继承导致设计者删除命名空间然后删除类。我希望这更容易。【参考方案7】:默认的 ASP 名称空间似乎不再起作用。所以我似乎无法从页面外部调用我的 User Controls.ascx 页面。给他们一个命名空间并将默认值从 ASP 更改为我的命名空间似乎可行。
【讨论】:
以上是关于如何将 ASP.NET 网站转换为 ASP.NET Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
在asp.net中如何将DataSet类型的数据集转换为List类型