学习 MVC - 第二部分:使用 LINQ to SQL 创建 MVC 应用程序并执行 CRUD 操作






4.95/5 (66投票s)
使用 LINQ to SQL 创建 MVC 应用程序并执行 CRUD 操作
- 下载 PDF_Article.zip - 5.4 MB
- 下载 SqlScriptToCreateTable.zip - 659 B
- 下载 SqlScriptToCreateDatabase.zip - 1,000 B
- 下载 LearningMVC.zip - 2.3 MB
引言
在本系列教程的第一部分中,我们对 MVC 有了初步了解。在这一部分中,我们将重点关注 MVC 模式的实际实现。我无需解释 MVC 的理论,因为我们已经在上一篇文章中涵盖了这一点。
我们的路线图
我们坚持以下议程
- 第一部分:MVC 架构和关注点分离简介。
- 第二部分:从头开始创建 MVC 应用程序并使用 LINQ to SQL 将其连接到数据库。
- 第三部分:借助 EntityFramework DB-First 方法连接 MVC 应用程序。
- 第四部分:借助 EntityFramework Code-First 方法连接 MVC 应用程序。
- 第五部分:在带有 EntityFramework 的 MVC 应用程序中实现 Repository 模式。
- 第六部分:在带有 EntityFramework 的 MVC 应用程序中实现通用 Repository 模式和 Unit Of Work 模式。
要涵盖的主题
- 从头开始创建一个 MVC 项目。
- 添加控制器、视图和模型。
- 创建示例数据库并使用 LINQ to SQL 进行通信。
- 使用 LINQ to SQL 在 MVC 应用程序中执行 CRUD 操作。
- 理解 ViewData、ViewBag 和 TempData。
- 通过
System.Component.DataAnnotation
进行模型验证。
1. 创建 MVC 项目
步骤 1:打开 Visual Studio 2010/2013(我使用的是 2010)。转到文件=>新建=>项目,选择 ASP.NET MVC3 Web 应用程序,如下图所示
将应用程序命名为 LearningMVC。
步骤 2: 将打开一个项目模板选择窗口,在其中选择“空”。将视图引擎选择为 Razor,然后按“确定”。
步骤 3:现在,我们的解决方案已准备就绪,其中包含一个空的 MVC 应用程序。
我们可以清楚地看到,与传统的 ASP.NET Web 应用程序相比,该解决方案包含一些额外的文件夹。
我们在 Views 文件夹中获得了 Models、Views Controllers 和一个 Shared 文件夹。这些文件夹包含它们各自的 MVC 参与者模型-视图-控制器。Views 中的共享文件夹包含 _Layout.cshtml,它可以用作我们创建的视图的主页面。
我们看到 global.asax 文件包含一个默认路由表,它定义了请求到来时要遵循的路由。它表示当请求到达 Home 控制器时,必须调用该 Home 控制器的 Index 操作。
动作是控制器中定义的方法(可以通过定义路由来调用)。动作方法也可以在上面提到的图中包含参数。它表示 Home 控制器有一个 Action Index,其中包含一个可选参数 ID。
当我们运行应用程序时,我们会得到如下所示的结果
它表示找不到我们正在寻找的资源。请求默认遵循 global.asax 中提到的默认路由,即转到控制器 Home 并调用方法 Index。由于我们还没有这些,浏览器会显示此错误。
没关系,让我们让浏览器高兴起来。
2. 添加控制器、视图和模型
步骤 1: 右键单击 Controllers 文件夹,创建一个名为 My 的控制器。添加带有空读/写操作的控制器,它将为我们提供一个包含一些默认生成操作的类。
请注意,每个操作名称都有两个操作,一个是用于 Get,即视图首次加载时,另一个是用于 POST,即视图提交一些数据时。
更改 global.asax RegisterRoutes
方法
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "My", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
注意:我们已根据我们添加的控制器更改了控制器的名称。
步骤 2: 我们可以看到我们有 Action,但它们返回一个 View,所以我们需要为它们创建 View。但在此之前,我们将为我们的 View 创建一个名为 User 的 Model。右键单击 Model 文件夹,添加一个名为 User 的类。
将以下属性添加到 User 类
现在我们的模型已创建,我们可以创建绑定到此特定模型的视图。
步骤 3: 转到控制器,右键单击控制器的空 Actions,然后从上下文菜单中选择顶部的 AddView。默认情况下,视图名称与 Action 名称相同。
例如,对于详情,
选择 Viewname 为 Details,Model class 为 User,Scaffold Template 为 Details。此模板指定视图的角色。此视图将显示用户(实体)的详细信息。单击添加。
同样,对所有操作执行此操作,并创建视图。
请注意,视图会自动添加到 My 文件夹下的 Views 文件夹中(根据控制器的名称自动创建)。这是为了保持 MVC 的特定结构,这样我们就不必承担维护它的开销。
现在我们有了控制器和视图,所以如果我们运行应用程序,我们会得到。
即,我们的 My 控制器的 Index Action 被触发,返回 Index View。
3. 创建示例数据库并使用 LINQ to SQL 进行通信。
我们的 MVC 应用程序已准备就绪,但除了显示虚拟数据外,我将运行与数据库对话的应用程序,以便我们可以涵盖应用程序更广泛的方面。
步骤 1: 创建数据库,脚本在附件中给出,只需在 SQL Server 2005/2008 上执行即可。
步骤 2: 向解决方案添加新项,选择 LINQ to SQL 类,将其命名为 MyDB.dbml。
我们的解决方案看起来像
步骤 3: 打开 Visual Studio 的服务器资源管理器,通过在服务器资源管理器打开连接窗口中提供服务器名称和现有数据库名称来打开连接。
点击“确定”。我们的解决方案看起来像:
步骤 4: 将 User 表拖到 DBML 设计器窗口,我们会在设计器窗口中以类图格式获取该表。
当我们打开 MyDB.designer.cs 时,我们得到 MyDBDataContext
类。此类以类和属性的形式保存数据库 User 表信息。对于表的每一列,都在类中创建了属性,我们可以使用这些属性从数据库中获取/设置值。
4. 在 MVC 应用程序中使用 LINQ to SQL 执行 CRUD 操作
我们现在有一个数据库,一个用于与数据库对话的上下文类,以及一个 MVC 应用程序,用于使用上下文类在数据库中执行 CRUD 操作。
步骤 1 读取
- 转到 Index Action,创建上下文类的实例。我们可以在该上下文的实例中获取所有表和列名。
- 创建一个查询以在 Index 视图上显示所有记录。
- 填充我们之前创建的 User 模型,并将其传递给 Index 视图(Index 视图将是 List 类型项模板)。
当我们运行应用程序时,我们得到一个空列表,即数据库中没有记录。
步骤 2 创建
- 首先编写创建用户的代码。对于 Create 的 Get Action 实例,将始终返回一个空视图。
- 当我们点击 Create 的提交按钮发布一些数据时,我们需要在表中创建一个新用户的数据条目。
- 当表单提交时,它会触发 Create 的 Post Action,其中已绑定的 User 模型属性会绑定到视图字段。我们将检索这些模型属性并创建上下文类实例,填充上下文 User 并提交到数据库。
- 将操作重定向到 Index,现在将在 Index 视图上显示一条记录。我们已成功创建用户。
- 在数据库中。
步骤 3 更新
步骤 4 删除
现在我们可以自己执行更新和删除,以下是更新和删除的屏幕。
编辑代码:
Get
Post
编辑的 Get Action View
编辑了一些字段
数据库中反映的更新
显示特定用户详细信息的代码
详情屏幕
注意:Details Action 没有 POST 操作,因为没有什么可以发布到控制器。
同样对于删除:
屏幕
删除后返回列表
删除后的数据库
是的,所有的 CRUD 操作都完成了。现在我们了解 MVC 了。
在完成第一部分之前,我想讨论一些基本场景,例如将数据从控制器传递到视图,控制器之间传递数据以及模型验证。
5. 理解 ViewData、ViewBag 和 TempData
我想讨论这个话题,因为这三个参与者之间有很多困惑
MVC 为我们提供了 ViewData
、ViewBag
和 TempData
,用于从控制器、视图以及后续请求中传递数据。ViewData
和 ViewBag
在某种程度上相似,但 TempData
执行额外的角色。让我们来看看这三个参与者的关键点
ViewBag 和 ViewData
我在我们从一开始就使用的同一个应用程序中编写了示例测试代码,
- 在 My 控制器的 Index Action 上填充
ViewData
和ViewBag
- 视图中获取
ViewData
/ViewBag
的代码
- 当运行应用程序时,我们在屏幕上得到
以下是 ViewData
和 ViewBag
之间的作用和相似之处
- 在从控制器移动到视图时维护数据。
- 将数据从控制器传递到相应的视图。
- 当发生任何重定向时,它们的值将变为 null,因为它们的作用是提供控制器和视图之间通信的方式。它是在服务器调用中进行通信的机制。
ViewData
和 ViewBag
之间的区别(摘自博客)
ViewData
是一个对象字典,它派生自ViewDataDictionary
类,并使用字符串作为键进行访问。ViewBag
是一个动态属性,它利用了 C# 4.0 中新的动态特性。ViewData
对于复杂数据类型需要类型转换,并检查空值以避免错误。ViewBag
对于复杂数据类型不需要类型转换。
TempData
TempData
是一个派生自 TempDataDictionary
类的字典,存储在短生命周期的会话中。它是一个字符串键和对象值。
它在一个 HTTP 请求期间保留信息。这意味着只能从一个页面到另一个页面。它有助于在从一个控制器移动到另一个控制器或从一个操作移动到另一个操作时维护数据。换句话说,当我们重定向时,Tempdata 有助于在这些重定向之间维护数据。它在内部使用会话变量。Temp data 仅在当前和后续请求期间使用,这意味着它仅在我们确定下一个请求将重定向到下一个视图时才使用。对于复杂数据类型,它需要类型转换并检查空值以避免错误。通常用于存储一次性消息,例如错误消息、验证消息。
我在 Edit Action 中添加了一个 TempData
,如下所示
[HttpPost]
public ActionResult Edit(int? id, User userDetails)
{
TempData["TempData Name"] = "Akhil";
…..
当视图重定向到 Index Action 时。
即,我跨 Action 获取 TempData
值。
6.模型验证
我们有许多方法可以在我们的 Web 应用程序中实现验证,例如客户端、服务器端等……
但 MVC 为我们提供了一个功能,只需编写一两行代码即可为模型添加验证注释。
public int UserId { get; set; }
[Required(ErrorMessage = "FirstName is required")]
public string FirstName { get; set; }
public string LastName { get; set; }
………..
现在当我们运行应用程序,并尝试在未指定 FirstName 的情况下编辑/创建用户时,我们会得到
惊讶吗!?是的,模型会通过这些注释自行验证。还有许多其他验证器,例如我使用的必填字段验证器。
使用模型验证时,不要忘记包含 System.ComponentModel.DataAnnotations;
命名空间。此命名空间包含用于验证的类。
结论
现在我们知道了 MVC 是什么,如何实现它,它的优点,以及 MVC 中的 CRUD 操作。本教程的后续部分将重点介绍更高级的主题,例如 EntityFramework、Repository Pattern、Unit Of Work Pattern 和 Code First 方法。
编程愉快 :)