从 MVC 开始 - 新手入门(第二部分)






4.83/5 (12投票s)
引言
大家好,希望你们已经看了上一篇文章,其中我们学习了如何开始使用 MVC 以及先决条件。这是文章“从 MVC 开始 - 新手入门指南(第 1 部分)”的续篇。正如我所承诺的,在这里你将学习如何使用 MVC 和 Entity To Sql 来查看已保存的记录、编辑记录。那么,让我们开始吧。
背景
如果你已经看过了本系列的第 1 部分,那么你已经准备好阅读本文了,否则请先阅读第 1 部分。虽然如果你已经了解 MVC,也可以从本文开始,但我仍然建议你先通读上一篇文章。那么,让我们开始“MVC 中的更新”。祝你好运!
使用代码
1. 查看已保存的记录(列表视图)
到目前为止,我们已经学习了如何向列表中添加新记录。现在,让我们开始学习如何查看我们添加的记录。这一部分至关重要,因为我们需要多次显示已保存的记录。所以在这里,你将看到一个简单的将记录显示在列表(表格)形式中的方法,当然你可以根据自己的需要自定义视图。这非常简单。
1. 在控制器中添加 Action 方法
现在,首先我们需要添加一个 Action
,它将返回一个用于显示列表数据的视图。下面是控制器代码的快照。我们在与第 1 部分相同的控制器(即“FirstController
”)中添加了这个 Action(方法)。
注意:要了解如何添加 Views
或 Controllers
,请参阅上一篇文章(第 5 步和第 6 步)。
public ActionResult ViewAllRecords() { //TODO : your entity framework code for showing the employee details StartWithMVCEntities db = new StartWithMVCEntities(); List<Employee> empList = db.Employees.ToList(); return View(empList); }
所以,这里你可能已经了解到,在 MVC 中,我们使用同一个控制器,但它可以通过使用多个 Model 来渲染或服务于多个用户视图。
现在让我们分析一下我们的代码,在第一行,我们建立了实体对象与数据库的连接,获取了所有记录,并将它们作为一个“List”对象,类型为 List<Employee>
,传递给了视图。
现在我们需要一个视图来显示这个可枚举对象中包含的记录。所以接下来是添加适当的视图。
2. 添加视图及其内容
现在请按照步骤为这个方法(Action 方法)添加视图。下面是它的 Razor 代码(HTML)。
@model List<StartWithMVC.Models.Employee> @{ ViewBag.Title = "ViewAllRecords"; } <h2>View Records</h2> <div class="table_container"> <table> <thead> <th>HR Emp Id</th> <th>Last Name</th> <th>First Name</th> <th>City</th> <td>Edit</td> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@item.HREmpId</td> <td>@item.LastName</td> <td>@item.FirstName</td> <td>@item.City</td> <td>@Html.ActionLink("Edit", "EditRecord", new { recordID = @item.EmpId })</td> </tr> } </tbody> </div>
现在我们必须牢记一点,传递给这个 Model 的对象是“List
”类型,所以我们在视图的开头添加了“List<StartWithMVC.Models.Employee>"。这样做可以让我们遍历传递过来的 Model 对象中的每一条记录。
注意:你可以使用任何可枚举对象(IDictionary, IEnumerable...等)来实现此目的,但 List 是最简单易懂的。
这里有一个快照,详细解释了这部分代码中的任何语法含义。
在这里,你会看到我使用了 ‘foreach
’ 循环来遍历 Model 中的每个项目。“@item
”对象是强类型化的,可以为我们添加的每个属性提供智能提示帮助。这样可以减少错误的可能性,因为强类型对象在编译时就会被验证。因此,修复错误非常容易,或者说在大多数情况下它们是防错的。
现在是时候构建项目来检验我们的成果了。
3. 构建并运行项目
现在我们已经准备好了显示记录的视图。只需运行项目,你就会看到所有已添加记录的列表视图。这是它的截图。
就是这样。是不是很简单!现在,自己尝试一下吧。祝你好运。
注意:我在这里添加了一些“样式”来让这个视图看起来像这样。你也可以将这些 CSS 添加到你的视图中。就在这里。只需将这个块粘贴到视图中的任何位置。
<style type="text/css"> table td, th { border:1px solid black; padding:2px; } div.table_container { float:left; width:100%; } </style>
但始终建议为你的样式编写样式表,并将其包含在捆绑包注册中。关于捆绑包注册的任何帮助,请随时提问。
2. 编辑已保存的记录
1. 编写编辑记录的 Action
如果你注意到,我在上面的 'cshtml' 文件中添加了一个带有 'EditRecords
' 方法引用的 Action Link。到目前为止,如果你运行项目并点击“Edit”链接,它会显示错误。这是因为 'controller 将会搜索 'EditRecords' action method,但它还不存在。所以它会抛出错误。
现在我们将看到如何使用 'EditRecords' action 来编辑记录。下面是编辑记录方法的代码。
public ActionResult EditRecord(int recordID) { //TODO : your entity framework code for showing the employee details StartWithMVCEntities db = new StartWithMVCEntities(); Employee objEmp = db.Employees.ToList().Find(m => m.EmpId == recordID); return View("Index", objEmp); }
现在在上面的方法中,你注意到的事情是
1. 参数 'recordID':这实际上是从编辑 Action Link 点击接收的参数。现在,当你将鼠标悬停在列表视图中编辑链接上时,你会看到类似这样的 URL:
https://:6092/First/EditRecord?recordID=2
这里是关于根据上面编写的代码,它意味着什么的详细说明:
/First -- > 指的是 FirstController,所以它会查找这个控制器
/EditRecord -- > 指的是我们 'FirstController' 中的 'EditRecord' 方法
?recordID=2 -- > 指的是它将搜索一个接受名为 'recordID' 的参数的方法,并且 '2' 将作为参数值传递。
2. Linq 表达式:这里我们正在获取具有 EmpID
等于传入的 recordID 的记录的 employee 对象。这是纯粹的 Linq to Entity 对象。
2. 返回:在这里你可以看到,我们使用 'Index
' 视图返回了 employee 记录的对象。那么为什么我们在这里使用 'Index' 视图呢??
答案:要编辑记录,我们需要为表中的每一列提供编辑字段。为此,我们有两种选择。
1. 添加新视图
2. 重新使用用于添加新记录的视图。
所以选择权在你,你想怎么做。但通常建议尽可能减少视图和控制器。此外,我们知道我们的 'Index
' 视图是 'Employe
e' 类型。所以我使用了那个视图。现在它将显示包含在 'objEmp
' 对象中的字段值。所以
我们就可以满足编辑记录的需求了。现在这里是它的快照,以便更好地解释。
2. 构建并运行项目
现在我们已经完成了编辑记录代码的编写。现在只需运行项目。
现在去查看记录页面,然后点击编辑链接。你将被重定向到 Index 视图,其中的字段将包含我们要编辑的记录的值。这是截图。
所以我们现在处于添加新记录的同一个视图,但在这里当你点击提交时,它将更新记录而不是添加新记录。我们如何在控制器中处理这个问题将在下一步说明。
3. 用于更新记录的方法
如果你还记得,我们已经编写了一个方法来处理提交按钮的“click”事件,通过表单 post 方法添加新记录。在这里,我们也将通过修改现有的添加新记录的方法,即 'SaveEmployee
' 来做同样的事情。
这是新方法:
public ActionResult SaveEmployee(Employee objEmployee) { StartWithMVCEntities db = new StartWithMVCEntities(); if (objEmployee != null && objEmployee.EmpId != 0) { //TODO : your entity framework code for updateing the employee details //fetch object for the editted employee record Employee objEmp = db.Employees.ToList().Find(m => m.EmpId == objEmployee.EmpId); //Assign the edited value to getch object objEmp.HREmpId = objEmployee.HREmpId; objEmp.FirstName = objEmployee.FirstName; objEmp.LastName = objEmployee.LastName; objEmp.Address = objEmployee.Address; objEmp.City = objEmployee.City; //finally save the chagne to database db.SaveChanges(); } else { //TODO : your entity framework code for saving the employee details db.Employees.AddObject(objEmployee); db.SaveChanges(); } return RedirectToAction("ViewAllRecords"); }
需要注意的改动
由于我们将 employee 记录对象传递给了视图,所以在编辑情况下 EmpID(主键)的值是非零的。所以我添加了基于 EmpID 的更新和保存检查。
现在,如果我们是从 'EditRecords' action 进入 Index 页面的,那么 EmpID 的值总是非零的,这样控制器方法 'SaveEmployee' 就会知道这是更新情况,而不是新记录保存情况。
4. 删除已保存的记录
在 MVC 中从数据库删除记录非常简单,步骤与之前执行的类似。为此,我们需要遵循以下步骤:
1. 创建删除链接
现在我们将向“查看所有记录”页面添加一列。这一列将包含一个链接,用于从我们的数据库中删除相应的记录。所以我们开始吧。
将以下代码添加到 '.cshtml' 文件中(根据第“2. 添加视图及其内容”步中的代码)。
用于表格标题
<td><b>Delete</b></td>
用于表格行
<td>@Html.ActionLink("Delete", "DeleteRecord", new { recordID = @item.EmpId })</td>
现在你可以看到,在点击这个 Action Link 时,我们调用了 'DeleteRecord
' 方法。
这是它在用户端的显示效果。
2. 控制器方法
现在,让我们看看要写入我们控制器删除记录的方法。在此之前,先看一下创建的链接 HTML:
<a href="/First/DeleteRecord?recordID=2">Delete</a>
我们现在清楚,它正在从我们的 'FirstController
' 调用 'DeleteRecord'
方法,该方法接受 recordID
作为参数。对于这个非常记录,recordID 的值为 2
。
下面是从数据库删除记录的方法。
public ActionResult DeleteRecord(int recordID) { //TODO : your entity framework code for deleting the employee details StartWithMVCEntities db = new StartWithMVCEntities(); Employee objEmp = db.Employees.ToList().Find(m => m.EmpId == recordID); db.Employees.DeleteObject(objEmp); db.SaveChanges(); return RedirectToAction("ViewAllRecords"); }
如你所见,在 MVC 模式中从数据库删除记录非常简单。
在这里,我们删除记录后,就将请求重新路由到显示所有记录的方法。
结论
在这些文章(第 1 部分和第 2 部分)中,我们看到了如何在 MVC 中使用 Entity to Sql 添加新记录、查看、更新和删除记录。现在,运行你的项目并按照步骤操作:
>> 添加新记录。
>> 转到“查看所有记录”页面。
>> 点击编辑链接
>> 进行更改并保存。
>> 点击删除链接
>> 重新加载的视图将包含更新后的数据。
所以,这是在 MVC 中保存、编辑、更新记录的最简单方法。
关注点
MVC 提供了一种全新的编码模式,可以重用单个控制器下的视图。在 MVC 中,只需很少的努力,你就可以管理任何大型应用程序。MVC 中最好的地方在于,你可以专注于你的部分(或你的职责),而不会影响他人。
在 MVC 中,只有必需的 HTML 部分才会反射到客户端,因此它比其他方法更快。
所以,当你处理大型项目时,它总是很有用的。
即将推出
下一步?下一篇文章将介绍 MVC with Ajax
希望这对你有帮助。欢迎提出所有疑问和建议!:)