我想将现有的ASP.NET应用程序迁移到ASP.NET MVC模式格式.我应该遵循什么程序?任何分步说明都会非常有用.
这是我的逐步指南,基于我们在从经典的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方法.这使我们能够通过在一系列冲刺中部分迁移一个或两个目录(或一个目录中的多个文件)来保持敏捷,而不是必须在更长的时间内一次性迁移整个站点.
在Visual Studio中创建一个新的ASP.Net MVC应用程序,并立即在Global.asax文件中创建规则,忽略当前站点中存在的文件夹的路由规则.
将文件夹从ASP.Net Web应用程序复制到ASP.Net MVC应用程序文件夹.运行网站并确保其正常工作(它应该没有使用路由规则).
选择要迁移的子目录中的子目录或文件子集.
对于此子目录中的每个.aspx页面:
一个.首先创建其视图.我倾向于使用网页浏览器呈现的页面版本作为我的基本HTML,然后将占位符放在我知道充满动态数据的位置.
湾 使用动态数据的占位符,使用简单数据类型创建模型的初稿.这个模型起初很简单,但是当你从原始网站迁移更多页面时会不断重构,所以不要担心它看起来有点沉重.如果你发现自己在一个模型中有太多属性可供选择,或者看到逻辑分组超出了某个项目子集的模型,那么这可能是一个标志,模型需要重构为拥有一个对象而不是这些简单的数据type作为属性,但由业务逻辑层组成.
C.如果尚未创建控制器,则创建控制器,并为计划确定应该路由到此视图的Action放置相应的ActionResult方法.如果您发现某个新操作未映射到旧网站的页面,则为控制器创建视图,并包含相应的// TODO:标记,以便您可以跟踪此操作以便在您之后实现已迁移现有页面.
d.如果您的global.asax.cs文件中已经没有{*catchall}路由规则,请考虑为未知操作添加一些处理代码.
即 为模型创建构造函数类,以便给定控制器将具有的某些参数(作为您的{id}或可能来自URL的Request.QueryString参数,或HTTP标头或cookie),模型将知道如何伸出现有的业务逻辑类,并通过View进行渲染.
F.转到列表中的下一页,然后从步骤a重新开始.
最后创建路由规则,该规则将调用新的Controller并允许实现您编写的Actions.调试,调试,调试......一旦你感到高兴一切顺利,删除你从主站点迁移的现有文件夹和文件,以及global.asax.cs中的IgnoreRoute规则.
如果您希望保留旧目录和文件名以保持连续性,则以您喜欢的任何方式创建重定向(例如,用户可能已经在旧站点中为某些页面添加了书签).
注意:如果在移植阶段保留MVC站点中旧子目录的确切名称,则最好在我意识到的时候迁移整个子目录,因为只需要执行一些文件就需要的路由规则write变得更加复杂,因为如果现有文件夹与路由规则的路径同名,并且该文件夹有Default.aspx文件,那么(/ foldername /)将默认为Default.aspx页面,因为它会占用路由的预防性规则.
提示:认真考虑使用RouteDebug之类的工具进行路由调试,这样您就可以找出上面的奇怪内容,或者当您有多个路由规则触发并导致意外行为时.
这是我的第一稿,如果我错过了任何步骤,或者如果你在指南中看到任何漏洞,请给我反馈,我会适当地修改答案.