41

我想将现有的 ASP.NET 应用程序迁移到 ASP.NET MVC 模式格式。我应该遵循什么程序?任何分步说明都会非常有帮助。

4

4 回答 4

74

这些是我的分步指南,基于我们在从经典 ASP.Net Webforms 迁移到 ASP.Net MVC 期间在我的公司所采取的步骤。它并不完美,并且仍在进行中,因为由于站点的大小,我们必须分阶段进行,但也许其他人会根据我们的结果找到并提交改进的答案。

阶段: 1. 计划 - 从 ASP.Net 中的 Web 表单迁移到 MVC 需要一些仔细的计划。我们在行动中犯的错误是没有意识到这个阶段的规划实际上有两个方面,路线规划和模型/控制器/动作规划。当您尝试扩展站点的功能或进行更复杂的迁移时,不这样做会导致以后出现严重问题。

提示: - 查看您当前的站点地图,并设计改进的站点地图/目录结构以在 ASP.Net MVC 应用程序中使用。为您的网站找出一种“语言”,例如 ASP.Net MVC 的默认行为是具有http://sitename/ {controller}/{action}/{id} 行为,但您可以在获得时覆盖它更多破解路由规则的经验。

  • 请记住,默认情况下,每个 Controller 将通过应用程序的虚拟子目录路由到,例如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 方法。这使我们能够通过在一系列冲刺中对一个或两个目录(或一个目录中的多个文件)进行部分迁移来保持敏捷,而不必在更长的时间内一次性迁移整个站点。

  1. 在 Visual Studio 中创建一个新的 ASP.Net MVC 应用程序,并立即在 Global.asax 文件中创建规则,忽略当前站点中存在的文件夹的路由规则。

  2. 将文件夹从 ASP.Net Web 应用程序复制到 ASP.Net MVC 应用程序文件夹。运行网站并确保其正常运行(应该是因为尚未使用任何路由规则)。

  3. 选择要迁移的子目录中的子目录或文件子集。

  4. 对于此子目录中的每个 .aspx 页:

    一个。首先创建它的视图。我倾向于使用网页浏览器呈现的版本作为我的基本 HTML,然后将占位符放在我知道的充满动态数据的位置。

    湾。使用动态数据的占位符,使用简单数据类型创建模型的初稿。这个模型一开始很简单,但随着您从原始站点迁移更多页面,它会不断重构,所以如果它开始看起来有点沉重,请不要担心。如果您发现自己在一个模型中的属性太多,或者看到超出某些项目子集模型的逻辑分组,这可能表明模型需要重构以拥有一个对象,而不是使用这些简单的数据类型作为属性,但由业务逻辑层组成。

    C。如果尚未创建控制器,请创建控制器,并为您的计划已确定应路由到此视图的 Action 放置适当的 ActionResult 方法。如果您意识到有一个新操作未映射到旧站点的页面,则为控制器创建视图,并包含适当的 //TODO: 标记,以便您可以跟踪此操作以在您执行后执行已迁移现有页面。

    d。如果您的 global.asax.cs 文件中还没有 {*catchall} 路由规则,请考虑为未知操作添加一些处理代码。

    e. 为模型创建构造函数类,以便给定控制器将具有的某些参数(作为您的 {id} 或可能来自 URL 的 Request.QueryString 参数或 HTTP 标头或 cookie 传递),模型将知道如何访问您现有的业务逻辑类并构建自身以供视图呈现。

    F。转到列表中的下一页并从步骤 a 重新开始。

  5. 最后创建将调用您的新控制器并允许执行您编写的操作的路由规则。调试、调试、调试...一旦您感到满意,一切都很好,请删除您从主站点迁移的现有文件夹和文件,以及 global.asax.cs 中的 IgnoreRoute 规则。

  6. 如果您希望保留旧目录和文件名以保持连续性(例如,用户可能已经为旧站点中的某些页面添加了书签),请以您喜欢的任何方式创建重定向。

注意:如果您在移植阶段保留 MVC 站点中旧子目录的确切名称,最好一次迁移整个子目录,因为只需执行几个文件,您需要的路由规则写入变得更加复杂,因为如果存在与路由规则路径同名的现有文件夹,并且该文件夹具有 Default.aspx 文件,则 (/foldername/) 将默认为 Default.aspx 页面,因为它需要优先于路由规则。

提示:认真考虑使用像RouteDebug这样的工具进行路由调试,这样你就可以找出像上面这样的奇怪事情,或者当你有多个路由规则触发并导致意外行为时。

这是我的初稿,如果我遗漏了任何步骤或者您在指南中发现任何漏洞,请给我反馈,我会适当地修改答案。

于 2009-02-24T14:11:13.223 回答
3

愿这些额外的提示会有所帮助

  • 将 <%-- 注释标签替换为 @*
  • 使用@RenderSection ("Footer",false) 为@section footer { } 等等,如果你有任何额外的ContentPlaceHolder除了 View which RenderBody ()中的主体。

  • 所有旧的正常runat="server"标签都是无害的,不会阻止编译,并且可以在之后清理

  • 在代码隐藏和标记 (Visible="True") 中很容易控制并通过使用 Control Id 在code_behind中控制的所有控件可见性必须重构为Razor 视图中的ViewBag集合和@if块。

  • 您还可以观看围绕该主题的 Pluralsight 精彩课程(3h 49m)

于 2017-08-27T13:01:19.547 回答
2

我认为没有从 ASP.NET WebForms 到 ASP.NET MVC 的“逐步迁移”这样的事情。它们是建立在同一个框架上的两种完全不同的设计模式,但是(在大多数情况下)有很多东西不仅需要移动,而且需要完全重新设计,如果你不只是想构建一个 web app 在 MVC 模板项目而不是 WebForms 模板上。

造成这种情况的主要原因是关注点的分离,这在 MVC 中比在 WebForms 中严格得多。我目前正在(嗯,我应该……)将一个旧的、有缺陷的爱好项目从 WebForms 迁移到 MVC,我的方法基本上是“查看功能,从头开始重新构建它”。当然,我有一些用于格式化输出等的辅助方法,我刚刚包含在我的新项目中,但我选择的大部分基本内容只是为了完全重做。你会惊讶于我现在用 MVC 达到同样的目标需要多少时间,我在一年半前为 WebForms 应用程序设置 - 使用 Entity Framework、jQuery 和其他甜蜜的东西,您将能够在几个小时内产生结果。

于 2009-02-10T13:13:25.830 回答
1

我的回答是“你没有”:)。如果你真的想这样做,你可以使用当前的 asp.net 站点作为你的最终目标,或者作为一个需求“文档”。也许您可以在模型中使用数据层,但您必须重新设计整个站点。

正如 Tomas 已经指出的那样,它与经典的 asp.net 非常不同。

于 2009-02-10T16:49:02.817 回答