将 ASP.NET Forms 迁移到 MVC 的策略考量
一个简单的案例研究。
引言
本文是对将 ASP.NET Forms 网站迁移到 ASP.NET MVC 网站的考量进行一次简短的“飞掠”。本文旨在作为一个简单的案例研究。
背景
有一些很棒的文章(请参阅参考文献)阐述了 ASP.NET Forms 和 MVC 之间的区别。
我有一个使用 Visual Studio 2005 'forms' C# 创建的“小型企业调度和付款跟踪”(或调度)网站。大部分 CRUD 操作都使用 SQL Server 存储过程。付款跟踪使用 ADO.NET 方法。
需要提及的内容太多太多,因此我已尽我所能来总结关键概念,并附带一些代码插图以示强调。
您要迁移的网站可能性质完全不同。本文中的概念仍然适用,尽管我们可以预期细节可能不太相关。例如,视频/音乐或零售网站不像我的调度网站那样频繁使用基于日期的方法。
为了让您对背景有一个简要的了解,我们应该简要说明调度网站的原因。小公司通常由为客户提供服务的专家组成。这些专家可能是理疗师、水管工、上门理发师。很可能有一位秘书为多位专家进行预约。因此,核心流程是:“接受预约”、“出席预约”、“收款”、“催收欠款”。水管工有多少次到工作现场却不知道会遇到什么?客户向接待员和水管工解释需要做什么,这有多么不专业?本文旨在解决这些问题。其他好处包括最大限度地提高专家的效率,并确保逾期发票全额付清。小型公司通常负担不起昂贵的 IT 系统。网站方法进入了 SaaS 交付模式,并允许 IT 随着公司的增长进行扩展/付费。MVC(和 Azure)的互操作性最大化了在整个业务周期中使用移动设备的可能性。
ASP.NET Forms 到 ASP.NET MVC 案例研究
结构
几张图说明了 ASP.NET Forms 和 ASP.NET MVC 之间的区别以及用于调度网站的迁移策略。然后使用具体的代码片段示例来说明相关的考量。
ASP.NET Forms/MVC 的区别和迁移策略
上面显示的 ASP.NET Forms 方法并没有使用任何特别新潮的技术。它遵循基于服务器的应用程序结构。WeekView.aspx.cs 中的 C# 代码页加载通过存储过程获取数据并将值赋给 Web 控件。
立即需要注意的几点是:
- (粉色)视图区域代表着陡峭的学习曲线,需要理解然后实施所需的更改。这是主要的区别所在,并立即构成了我们迁移策略的第一部分。我们必须理解 WeekView.aspx.cs 的哪些部分必须剥离并实现在 WeekView.cshtml 中。
- ASP.NET MVC 控制器对视图控件没有任何“了解”。您必须设计如何获取数据并将其绑定到视图控件。调度网站选择的方法是使用 JavaScript 的 `$(document).ready`,这与 .aspx.cs 的 `Page_Load` 非常相似,因为两个函数都在页面加载时启动。JavaScript 的 `$(document).ready` 函数通过 Ajax/JSON 和对 Controller/Action 的调用来获取数据,并调用 **不变** 的 Data Adapters、存储过程和数据库表。
- 上面 **不变** 这个词暗示了所选择的迁移策略是解耦 Web 控件与 .aspx /.aspx.cs,并将它们移入 .cshtml 视图。我们失去的是备受喜爱的拖放式 Visual Studio 设计器,以及双击控件以创建代码隐藏 asp.control 方法存根。
- CSS3、HTML 5、Razor、JavaScript、JSON、AJAX(更不用说 NuGet)应被视为独立的语言。因此,与拥有 asp.controls 语法、事件处理程序和 C# 代码隐藏不同,我们现在面临着陡峭的学习曲线。至少一开始,很难在需要考虑如此多不同“语言”的层次时来可视化设计。
- 如果您接受上面第 3 点和第 4 点,那么在仅专注于让视图正常工作时,忽略对控件到模型的任何改进也是有意义的。回顾上面的 MVC 结构摘要图,我们应该注意到 Enterprise Framework (EF) 和 LINQ/ORM 被划掉了。记录和“暂存”任何建议,然后继续前进,这是个好习惯。调度网站的设计假设一个稀疏矩阵,这意味着数据库可能只有几个预约对应 250 多个 15 分钟的预约时段。可用的存储过程处理 CRUD 操作 **和** 一些简单的调度规则。关键在于,在实现 EF 或 LINQ/ORM 之前,需要进行严肃的设计、概念测试和编程。
- 部分业务逻辑需要移至视图,而其他部分将保持不变。例如,搜索特定公司的专家的代码应保留在 Controller-Action/Data Adapter/Stored Procedure 空间中。接收 Controller-Action 数据然后更新 `
一个具体的例子
首先,让我们提一些痛点。实现正确且最新的 JavaScript 库 **确实** 是个痛点。NuGet 绝对有帮助,因为它会维护库之间的依赖关系。您仍然需要正确地引用/调用库。很可能会使用第三方 JavaScript 库。'jqueri-ui' 是一个非常受欢迎的库,因为它扩展了 Visual Studio/Razor 附带的基本控件。调度网站实现了 datepicker ajax jquery-ui 控件。
另一个痛点是如何实现 JavaScript/Ajax/JSON/Controller-Action 的链接。诸如在 Action 前遗漏 `[HttpPost]` 之类的小问题可能会导致出现一个无用的“500”弹出窗口。最大的帮助是关键字调试器;然后单步执行代码。我学会了从现有 Action 复制存根,而不是创建新的。
现在来看我们的具体示例。这是 WeekView.aspx.cs 中的代码,它(在页面加载时)删除任何现有选项,获取公司的专家数据,并更新公司专家的下拉列表。
关键在于,ExpertDropDownList asp 控件可以轻松地由代码隐藏进行更新。
现在深吸一口气,因为一旦您习惯了 View/JavaScript/Controller 的方法,它就会变得相当熟悉。
事实上,上面的视图代码是更大片段的一部分,因此闭合标签可能不是完全正确的;尽管我认为它是正确的。任何发现改进之处的人都将获得五星好评。此外,欢迎关于在哪里可以找到描述 CSS3、HTML 5、Razor、JavaScript、JSON、AJAX 的优秀资源的评论。
摘要
在学习了 MVC(和 Azure 编程)直到我的大脑感觉要煮沸之后,我决定将 MVC 原则应用于现有的调度网站。
为了回报我使用过的许多论坛帖子和文章,这是我尝试分享我的学习经验。
从 ASP.NET Forms 切换到 MVC 有一个陡峭的学习曲线。Razor 有其自己的语法。JavaScript、JSON、AJAX 本身也是小型学科领域。然后还有架构和设计上的变化需要考虑。我记得一位微软 ASP.NET 大师说,世界上最好的代码是已经编写好并且可以重用的代码。这里采取的方法遵循了这个想法,并符合敏捷对“质量”的定义。
我希望本文能够为我们共享的知识库做出贡献。在我开始学习之前,我个人会很欣赏这篇文章。我搜索过,但还没有在任何地方找到类似的文章。现在我这么说了,我确信会有人给我指明我本该去哪里找。
推荐文章
- https://codeproject.org.cn/Articles/38778/ASP-NET-WebForms-and-ASP-NET-MVC-in-Harmony
- https://codeproject.org.cn/Articles/552846/Why-s-How-s-of-Asp-Net-MVC-Part
文档历史
版本1 2014年4月5日。修正了2个错别字。
版本0 2014年4月4日。初稿。