65.9K
CodeProject 正在变化。 阅读更多。
Home

将 ASP.NET Forms 迁移到 MVC 的策略考量

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (10投票s)

2014 年 4 月 4 日

CPOL

7分钟阅读

viewsIcon

27168

一个简单的案例研究。

引言

本文是对将 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 控件。

立即需要注意的几点是:

  1. (粉色)视图区域代表着陡峭的学习曲线,需要理解然后实施所需的更改。这是主要的区别所在,并立即构成了我们迁移策略的第一部分。我们必须理解 WeekView.aspx.cs 的哪些部分必须剥离并实现在 WeekView.cshtml 中。
  2. ASP.NET MVC 控制器对视图控件没有任何“了解”。您必须设计如何获取数据并将其绑定到视图控件。调度网站选择的方法是使用 JavaScript 的 `$(document).ready`,这与 .aspx.cs 的 `Page_Load` 非常相似,因为两个函数都在页面加载时启动。JavaScript 的 `$(document).ready` 函数通过 Ajax/JSON 和对 Controller/Action 的调用来获取数据,并调用 **不变** 的 Data Adapters、存储过程和数据库表。
  3. 上面 **不变** 这个词暗示了所选择的迁移策略是解耦 Web 控件与 .aspx /.aspx.cs,并将它们移入 .cshtml 视图。我们失去的是备受喜爱的拖放式 Visual Studio 设计器,以及双击控件以创建代码隐藏 asp.control 方法存根。
  4. CSS3、HTML 5、Razor、JavaScript、JSON、AJAX(更不用说 NuGet)应被视为独立的语言。因此,与拥有 asp.controls 语法、事件处理程序和 C# 代码隐藏不同,我们现在面临着陡峭的学习曲线。至少一开始,很难在需要考虑如此多不同“语言”的层次时来可视化设计。
  5. 如果您接受上面第 3 点和第 4 点,那么在仅专注于让视图正常工作时,忽略对控件到模型的任何改进也是有意义的。回顾上面的 MVC 结构摘要图,我们应该注意到 Enterprise Framework (EF) 和 LINQ/ORM 被划掉了。记录和“暂存”任何建议,然后继续前进,这是个好习惯。调度网站的设计假设一个稀疏矩阵,这意味着数据库可能只有几个预约对应 250 多个 15 分钟的预约时段。可用的存储过程处理 CRUD 操作 **和** 一些简单的调度规则。关键在于,在实现 EF 或 LINQ/ORM 之前,需要进行严肃的设计、概念测试和编程。
  6. 部分业务逻辑需要移至视图,而其他部分将保持不变。例如,搜索特定公司的专家的代码应保留在 Controller-Action/Data Adapter/Stored Procedure 空间中。接收 Controller-Action 数据然后更新 `