【发布时间】:2010-10-06 15:26:06
【问题描述】:
我想将现有的 ASP.NET 应用程序迁移到 ASP.NET MVC 模式格式。我应该遵循什么程序?任何分步说明都会非常有帮助。
【问题讨论】:
标签: asp.net-mvc webforms migrate
我想将现有的 ASP.NET 应用程序迁移到 ASP.NET MVC 模式格式。我应该遵循什么程序?任何分步说明都会非常有帮助。
【问题讨论】:
标签: asp.net-mvc webforms migrate
我认为没有从 ASP.NET WebForms 到 ASP.NET MVC 的“逐步迁移”这样的事情。它们是建立在同一个框架上的两种完全不同的设计模式,但是(在大多数情况下)有很多东西不仅需要移动,而且需要完全重新设计,如果你不只是想构建一个 web应用在 MVC 模板项目而不是 WebForms 模板上。
这样做的主要原因是关注点的分离,这在 MVC 中比在 WebForms 中严格得多。我目前正在(嗯,我应该......)将一个旧的、非常错误的爱好项目从 WebForms 迁移到 MVC,我的方法基本上是“查看功能,从头开始重新构建它”。当然,我有一些用于格式化输出等的辅助方法,我刚刚包含在我的新项目中,但我选择的大多数基本内容只是为了完全重做。你会惊讶于我现在用 MVC 达到同样的目标需要多少时间,我在一年半前为 WebForms 应用程序设置 - 使用 Entity Framework、jQuery 和其他甜蜜的东西,您将能够在几个小时内产生结果。
【讨论】:
我的回答是“你不会”:)。如果你真的想这样做,你可以使用当前的 asp.net 站点作为你的最终目标,或者作为一个需求“文档”。也许您可以在模型中使用数据层,但您必须重新设计整个站点。
正如 Tomas 已经指出的,它与经典的 asp.net 非常不同。
【讨论】:
这些是我的分步指南,基于我们在从经典 ASP.Net Webforms 迁移到 ASP.Net MVC 期间在我的公司采取的步骤。它并不完美,并且仍在进行中,因为由于网站的大小,我们必须分阶段进行,但也许其他人会根据我们的结果找到并提交改进的答案。
阶段: 1. 规划——从 ASP.Net 中的 Web 表单迁移到 MVC 需要一些仔细的规划。我们在行动中犯的错误是没有意识到这个阶段的规划实际上有两个方面,路线规划和模型/控制器/动作规划。 当您尝试扩展网站的功能或进行更复杂的迁移时,不这样做会导致以后出现严重问题。
提示: - 查看您当前的站点地图,并设计改进的站点地图/目录结构以在 ASP.Net MVC 应用程序中使用。为您的网站找出一种“语言”,例如ASP.Net MVC 的默认行为是具有 http://sitename/{controller}/{action}/{id} 行为,但是当您获得更多破解路由规则的经验时,您可以覆盖它。
请记住,默认情况下,每个控制器都将通过应用程序的虚拟子目录路由到,例如http://sitename/X 将路由到 XController(默认情况下它的 Index 方法),http://sitename/Y/Get 将路由到 YController 的 Get() 方法。你可以随意改变它(路由真的很强大),但这超出了这个答案的范围。
使用现有的站点地图,指定每个当前 .aspx 页面应该落在 MVC 结构中的哪个文件夹(当然,首先要询问它是否应该存在)。
如果脚本、图像等没有存储在一起,或者没有存储在每个子目录中的某些“保留名称”文件夹中,请在重新设计时考虑这样做。 这是因为它允许您在 Global.aspx.cs 文件中使用 Map.IgnoreRoute() 路由规则命令绕过将这些文件夹作为路由处理,从而大大简化您的设计。
在我们的例子中,我们镜像了当前站点的真实子目录布局,其中每个子目录都成为一个控制器,例如/Account 将有一个 AccountController,/X 将有 XController。落入其中的所有页面都被每个控制器中的操作替换。例如http://sitename/profile/about.aspx 现在变为 http://sitename/profile/about 并映射到 profileController 中的“about”ActionResult 方法。 这使我们能够通过在一系列 sprint 中对一个或两个目录(或一个目录中的多个文件)进行部分迁移来保持敏捷,而不必在更长的时间内一次性迁移整个站点。
在 Visual Studio 中创建一个新的 ASP.Net MVC 应用程序,并立即在 Global.asax 文件中创建规则,忽略当前站点中存在的文件夹的路由规则。
将文件夹从 ASP.Net Web 应用程序复制到 ASP.Net MVC 应用程序文件夹。运行网站并确保其正常运行(应该是因为尚未使用任何路由规则)。
选择要迁移的子目录中的子目录或文件子集。
对于此子目录中的每个 .aspx 页面:
一个。首先创建它的视图。我倾向于使用网页浏览器呈现的版本作为我的基本 HTML,然后将占位符放在我知道的填充有动态数据的位置。
b.使用动态数据的占位符,使用简单数据类型创建模型的初稿。这个模型一开始很简单,但随着您从原始站点迁移更多页面,它会不断重构,所以如果它开始看起来有点沉重,请不要担心。如果您发现自己在一个模型中的属性太多,或者看到超出某些项目子集模型的逻辑分组,这可能表明模型需要重构以拥有一个对象,而不是使用这些简单的数据类型作为属性,但由业务逻辑层组成。
c。如果尚未创建控制器,请创建控制器,并为您的计划已确定应路由到此视图的 Action 放置适当的 ActionResult 方法。 如果您意识到有一个新操作未映射到旧站点的页面,则为控制器创建视图,并包含适当的 //TODO: 标记,以便您可以跟踪此操作以在您执行后执行已迁移现有页面。
d。如果您的 global.asax.cs 文件中还没有 {*catchall} 路由规则,请考虑为未知操作添加一些处理代码。
e。为模型创建构造函数类,以便给定控制器将具有的某些参数(作为您的 {id} 或可能来自 URL 的 Request.QueryString 参数或 HTTP 标头或 cookie 传递),模型将知道如何访问您现有的业务逻辑类并构建自己以供视图呈现。
f。转到列表中的下一页并从步骤 a 重新开始。
最后创建将调用您的新控制器并允许执行您编写的操作的路由规则。调试、调试、调试...一旦您感到满意,一切都很好,请删除您从主站点迁移的现有文件夹和文件,以及 global.asax.cs 中的 IgnoreRoute 规则。
如果您希望保留旧目录和文件名以保持连续性,请以您喜欢的任何方式创建重定向(例如,用户可能已经为旧站点中的某些页面添加了书签)。
注意:如果您在移植阶段保留 MVC 站点中旧子目录的确切名称,最好一次迁移整个子目录,因为只需执行几个文件即可您需要编写变得更加复杂,因为如果存在与路由规则路径同名的现有文件夹并且该文件夹具有 Default.aspx 文件,则 (/foldername/) 将默认为 Default.aspx 页面,因为它需要 precidence通过路由规则。
提示:认真考虑使用RouteDebug 之类的工具进行路由调试,这样您就可以找出上述奇怪的事情,或者当您有多个路由规则触发并导致意外行为时。
这是我的初稿,如果我遗漏了任何步骤或者您发现指南中有任何漏洞,请给我反馈,我会适当地修改答案。
【讨论】:
希望这些额外的提示会有所帮助
使用@RenderSection("Footer",false) 为@section 页脚{ } 等等,如果你有任何额外的ContentPlaceHolder 除了主体在查看哪个 RenderBody() .
所有旧的正常runat="server"标签都是无害的,不妨碍编译,之后可以清理
所有控件可见性,在代码隐藏和标记 (Visible="True") 中很容易控制,并在 code_behind 中使用 Control Id 进行控制,必须将其重构为 ViewBag Razor 视图中的集合和 @if 块。
你也可以围绕这个观看 Pluralsight 的精彩课程 主题(3h 49m)
【讨论】: