我想现在将asp.net应用程序迁移到asp.net MVC模式格式。我应该遵循什么程序?任何分步说明将是非常有益的。
解决方法
这些是我的分步指南,基于我们在从一个典型的ASP.Net Webforms移动到ASP.Net MVC时我们在公司采取的步骤。这不是完美的,仍然是持续的,因为我们必须这样做的阶段,因为网站的大小,但也许有人会发现和文件基于我们的结果改进的答案。
@H_502_6@阶段:
1.规划 – 从ASP.NET中的Web窗体迁移到MVC需要一些细心的规划。我们在移动中所犯的错误并不意味着在规划,路线规划和模型/控制器/行动规划的这个阶段确实有两个方面。
不这样做会导致严重的问题,以后尝试扩展您的网站的功能或打更复杂的迁移。 @H_502_6@提示:
– 查看您当前的站点地图,并设计在ASP.Net MVC应用程序中使用的改进的站点地图/目录结构。找出您的网站的“语言”,例如ASP.Net MVC的默认行为是有一个http://sitename/ {controller} / {action} / {id}行为,但你可以覆盖这个,因为你获得更多的经验黑客路由规则。 @H_502_6@>记住默认情况下,每个控制器将通过应用程序的虚拟子目录路由到,例如。 http://sitename/X会路由到XController(默认情况下它的Index方法),http://sitename/Y/Get将路由到YController的Get()方法。你可以随意改变(路由的真正强大),但这超出了这个答案的范围。
>使用现有的站点地图,指定MVC结构中每个当前.aspx页面应该落在哪个文件夹(当然,首先询问它是否应该存在)。
>如果脚本,图像等不存储在一起,或在每个子目录中的某些“保留名称”文件夹中,请考虑在重新设计时这样做。
这是因为它将大大简化您的设计,允许您在Global.aspx.cs文件中使用Map.IgnoreRoute()路由规则命令绕过处理这些文件夹作为路由。 @H_502_6@在我们的例子中,我们镜像了当前站点的真正的子目录布局,其中每个子目录成为一个控制器,例如。 / Account会有一个AccountController,/ X会有XController。其中的所有页面都被每个控制器中的操作替换。例如http://sitename/profile/about.aspx现在变为http://sitename/profile/about并映射到profileController中的“about”ActionResult方法。
这使我们能够通过在一系列冲刺中部分迁移一个或两个目录(或一个目录中的多个文件)来保持敏捷,而不必在一段时间内迁移整个站点。 @H_502_6@>在Visual Studio中创建一个新的ASP.Net MVC应用程序,并立即在Global.asax文件中创建规则,忽略当前站点中存在的文件夹的路由规则。
>将文件夹从ASP.Net Web应用程序复制到ASP.Net MVC应用程序文件夹。运行网站并确保它正常工作(应该没有使用路由规则)。
>选择要迁移的子目录中的子目录或子文件。
>对于此子目录中的每个.aspx页面: @H_502_6@一个。首先创建其视图。我倾向于使用网页浏览器呈现版本的页面作为我的基本HTML,然后在我知道的位置填充动态数据的占位符。 @H_502_6@b。使用动态数据的占位符,使用简单的数据类型创建模型的初稿。这个模型将从简单的开始,但不断重构,因为你从原始网站迁移更多的网页,所以不要担心,如果它开始看起来有点重。如果你发现自己在一个模型中有太多的属性,你的品味,或看到一个逻辑分组超出了某些子集的项目的模型,也许这是一个迹象,该模型需要重构为有一个对象,而不是这些简单的数据类型作为属性,但在业务逻辑层中组成。 @H_502_6@C。如果尚未创建控制器,则创建控制器,并为您的计划已确定应该路由到此视图的Action放置适当的ActionResult方法。
如果你意识到有一个新的动作,不映射到旧站点的页面,然后创建控制器的视图,并包括适当的// TODO:标签,以便你可以跟踪这一点实现后你已迁移现有页面。 @H_502_6@d。考虑为未知操作设置一些处理代码,如果你的global.asax.cs文件中没有一个{* catchall}路由规则。 @H_502_6@e。为模型创建构造函数类,以便给定Controller将拥有的某些参数(作为您的{id}传递,或者可能是URL中的Request.QueryString参数,或HTTP头或cookie),Model将知道如何接触到您现有的业务逻辑类并构建自己以供View进行呈现。 @H_502_6@F。转到列表中的下一页,然后从步骤a重新开始。
>最后创建路由规则,该路由规则将调用您的新控制器并允许实现您编写的操作。调试,调试,调试…一旦你很高兴一切顺利,删除现有的文件夹和文件,你迁移从你的主要网站,以及global.asax.cs中的IgnoreRoute规则。
>如果您希望保留旧的目录和文件名以保持连续性(例如,用户可能已在旧网站中为某些网页添加了书签),请以任何您喜欢的方式创建重定向。 @H_502_6@注意:如果你在移植阶段保持你的MVC网站的旧子目录的确切名字,最好是迁移整个子目录,我已经意识到,因为只做一些文件你需要的路由规则写变得更加复杂,因为如果现有文件夹存在与路由规则的路径相同的名称,并且该文件夹具有Default.aspx文件,则(/ foldername /)将默认为Default.aspx页面,因为它采取路由的先决条件规则。 @H_502_6@提示:认真考虑使用像RouteDebug这样的工具进行路由调试,以便了解上述奇怪的事情,或者有多个路由规则触发并导致意外行为。 @H_502_6@这是我的第一稿,如果我错过了任何步骤,或者您看到指南中有任何漏洞,请给我反馈,我将适当地修改答案。
1.规划 – 从ASP.NET中的Web窗体迁移到MVC需要一些细心的规划。我们在移动中所犯的错误并不意味着在规划,路线规划和模型/控制器/行动规划的这个阶段确实有两个方面。
不这样做会导致严重的问题,以后尝试扩展您的网站的功能或打更复杂的迁移。 @H_502_6@提示:
– 查看您当前的站点地图,并设计在ASP.Net MVC应用程序中使用的改进的站点地图/目录结构。找出您的网站的“语言”,例如ASP.Net MVC的默认行为是有一个http://sitename/ {controller} / {action} / {id}行为,但你可以覆盖这个,因为你获得更多的经验黑客路由规则。 @H_502_6@>记住默认情况下,每个控制器将通过应用程序的虚拟子目录路由到,例如。 http://sitename/X会路由到XController(默认情况下它的Index方法),http://sitename/Y/Get将路由到YController的Get()方法。你可以随意改变(路由的真正强大),但这超出了这个答案的范围。
>使用现有的站点地图,指定MVC结构中每个当前.aspx页面应该落在哪个文件夹(当然,首先询问它是否应该存在)。
>如果脚本,图像等不存储在一起,或在每个子目录中的某些“保留名称”文件夹中,请考虑在重新设计时这样做。
这是因为它将大大简化您的设计,允许您在Global.aspx.cs文件中使用Map.IgnoreRoute()路由规则命令绕过处理这些文件夹作为路由。 @H_502_6@在我们的例子中,我们镜像了当前站点的真正的子目录布局,其中每个子目录成为一个控制器,例如。 / Account会有一个AccountController,/ X会有XController。其中的所有页面都被每个控制器中的操作替换。例如http://sitename/profile/about.aspx现在变为http://sitename/profile/about并映射到profileController中的“about”ActionResult方法。
这使我们能够通过在一系列冲刺中部分迁移一个或两个目录(或一个目录中的多个文件)来保持敏捷,而不必在一段时间内迁移整个站点。 @H_502_6@>在Visual Studio中创建一个新的ASP.Net MVC应用程序,并立即在Global.asax文件中创建规则,忽略当前站点中存在的文件夹的路由规则。
>将文件夹从ASP.Net Web应用程序复制到ASP.Net MVC应用程序文件夹。运行网站并确保它正常工作(应该没有使用路由规则)。
>选择要迁移的子目录中的子目录或子文件。
>对于此子目录中的每个.aspx页面: @H_502_6@一个。首先创建其视图。我倾向于使用网页浏览器呈现版本的页面作为我的基本HTML,然后在我知道的位置填充动态数据的占位符。 @H_502_6@b。使用动态数据的占位符,使用简单的数据类型创建模型的初稿。这个模型将从简单的开始,但不断重构,因为你从原始网站迁移更多的网页,所以不要担心,如果它开始看起来有点重。如果你发现自己在一个模型中有太多的属性,你的品味,或看到一个逻辑分组超出了某些子集的项目的模型,也许这是一个迹象,该模型需要重构为有一个对象,而不是这些简单的数据类型作为属性,但在业务逻辑层中组成。 @H_502_6@C。如果尚未创建控制器,则创建控制器,并为您的计划已确定应该路由到此视图的Action放置适当的ActionResult方法。
如果你意识到有一个新的动作,不映射到旧站点的页面,然后创建控制器的视图,并包括适当的// TODO:标签,以便你可以跟踪这一点实现后你已迁移现有页面。 @H_502_6@d。考虑为未知操作设置一些处理代码,如果你的global.asax.cs文件中没有一个{* catchall}路由规则。 @H_502_6@e。为模型创建构造函数类,以便给定Controller将拥有的某些参数(作为您的{id}传递,或者可能是URL中的Request.QueryString参数,或HTTP头或cookie),Model将知道如何接触到您现有的业务逻辑类并构建自己以供View进行呈现。 @H_502_6@F。转到列表中的下一页,然后从步骤a重新开始。
>最后创建路由规则,该路由规则将调用您的新控制器并允许实现您编写的操作。调试,调试,调试…一旦你很高兴一切顺利,删除现有的文件夹和文件,你迁移从你的主要网站,以及global.asax.cs中的IgnoreRoute规则。
>如果您希望保留旧的目录和文件名以保持连续性(例如,用户可能已在旧网站中为某些网页添加了书签),请以任何您喜欢的方式创建重定向。 @H_502_6@注意:如果你在移植阶段保持你的MVC网站的旧子目录的确切名字,最好是迁移整个子目录,我已经意识到,因为只做一些文件你需要的路由规则写变得更加复杂,因为如果现有文件夹存在与路由规则的路径相同的名称,并且该文件夹具有Default.aspx文件,则(/ foldername /)将默认为Default.aspx页面,因为它采取路由的先决条件规则。 @H_502_6@提示:认真考虑使用像RouteDebug这样的工具进行路由调试,以便了解上述奇怪的事情,或者有多个路由规则触发并导致意外行为。 @H_502_6@这是我的第一稿,如果我错过了任何步骤,或者您看到指南中有任何漏洞,请给我反馈,我将适当地修改答案。