Stephen Walther 从头开始到结束建立了整个数据驱动ASP.NET MVC应用程序。这个教程对于那些刚刚接触ASP.NET MVC框架以及想要获得一种建立ASP.NET MVC应用程序的过程的新人是一个很好的介绍。
为简化创建应用程序的过程,我们会充分利用Visual Studio 2008的功能。我们会让 Visual Studio为我们的控制层,模型层,视图层生成初始代码和内容。 如果你已经使用Active Server Pages 或者 ASP.NET来工作,那么你将对ASP.NET MVC很熟悉。ASP.NET MVC 视图与ASP应用程序的页面非常相似。并且与传统的ASP.NET Web Forms 应用程序一样, ASP.NET MVC 为你提供了丰富的语言和.NET框架类。我希望这篇教程将让你了解到创建ASP.NET MVC应用程序的经验与创建ASP or ASP.NET Web Forms 应用程序的相似点和不同点.
这部电影数据库应用程序的概述
篇前部分(准备工作)
创建一个ASP.NET MVC Web Application 项目
当你创建一个新的MVC Web Application项目时 Visual Studio提示你去创造一个独立的单元测试项目,如图2所示。因为在这一课中我们不会创建测试,选择“否”选项,并点击“确定”按钮。
ASP.NET MVC应用程序有一系列标准的文件夹:模型、视图和控制的文件夹。你可以在“解决方案资源管理器”中看到这一系列标准的文件夹。我们需要添加文件到模型层,视图层和控制层文件夹,用以创建我们的电影的数据库应用程序。
接下来,我们要创造一个新数据库表。从服务器资源管理器窗口,右键点击该表格的文件夹“表”,并选择菜单选项“添加新表”。选择这个菜单选项打开数据库表设计器。创建以下数据库的栏目。
第一列,Id列,有两个特殊的属性。首先,你需要标记Id列为主键列。选择后,点击Id列的“设置主键”选项(它是图标看起来像一个钥匙)。其次,你需要标记Id列作为一个标记列。在这个“列属性”窗口,向下转动滚轮至“标识规范”并且展开该节点,改变“(是标识)”为“是”。当你完成,表应该看起来像下图所示。
最后一步是保存这个新表。点击“保存按钮,并且给新表命名为Movies。
创建模型层 你点击“添加”按钮后,这个实体数据模型向导出现(见图)。遵循这些步骤来完成向导。 1。在选择模型内容这一步,选择“从数据库生成”的选择。 图8
在你完成实体数据模型向导,实体数据模型设计器将开启。设计器应该显示 Movies数据库表(见图10)。
在我们继续之前,我们需要做一点改变。这个实体数据向导生成一个Movies的模型类,代表 Movies数据库表。因为我们将使用这个 Movies 类代表某一特定的电影,我们需要修改这个类的名称为Movie而不是Movies(单数而不是复数)。
创建ASP.NET MVC 控制层
3。点击“添加”按钮来添加新的控制器。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace MovieApp.Controllers 8 { 9 public class HomeController : Controller 10 { 11 // 12 // GET: /Home/ 13 14 public ActionResult Index() 15 { 16 return View(); 17 } 18 19 // 20 // GET: /Home/Details/5 21 22 public ActionResult Details(int id) 23 { 24 return View(); 25 } 26 27 // 28 // GET: /Home/Create 29 30 public ActionResult Create() 31 { 32 return View(); 33 } 34 35 // 36 // POST: /Home/Create 37 38 [HttpPost] 39 public ActionResult Create(FormCollection collection) 40 { 41 try 42 { 43 // TODO: Add insert logic here 44 45 return RedirectToAction('Index'); 46 } 47 catch 48 { 49 return View(); 50 } 51 } 52 53 // 54 // GET: /Home/Edit/5 55 56 public ActionResult Edit(int id) 57 { 58 return View(); 59 } 60 61 // 62 // POST: /Home/Edit/5 63 64 [HttpPost] 65 public ActionResult Edit(int id, FormCollection collection) 66 { 67 try 68 { 69 // TODO: Add update logic here 70 71 return RedirectToAction('Index'); 72 } 73 catch 74 { 75 return View(); 76 } 77 } 78 79 // 80 // GET: /Home/Delete/5 81 82 public ActionResult Delete(int id) 83 { 84 return View(); 85 } 86 87 // 88 // POST: /Home/Delete/5 89 90 [HttpPost] 91 public ActionResult Delete(int id, FormCollection collection) 92 { 93 try 94 { 95 // TODO: Add delete logic here 96 97 return RedirectToAction('Index'); 98 } 99 catch 100 { 101 return View(); 102 } 103 } 104 } 105 } 106 107
列出数据库记录 我们将使用 Index()方法来显示Movies数据库表的一些数据。我们将使用Index()方法,利用数据库模型类来检索Movies数据库记录。 1 public class HomeController : Controller 2 { 3 4 // 5 // GET: /Home/ 6 7 private MovieApp.Models.MoviesDBEntities _db = new 8 9 Models.MoviesDBEntities(); 10 public ActionResult Index() 11 { 12 //return View(); 13 return View(_db.Movies.ToList()); 14 } 15 .... 16 }
Index()方法将返回一个命名为Index的视图view。我们需要创建这个view来显示movies数据库记录的列表。遵循这些步骤: 2。在对话框的角度,勾选“创建强类型视图”复选框。 Listing 3 – Views\Home\Index.aspx
1 <%@ Page Title='' Language='C#' 2 3 MasterPageFile='~/Views/Shared/Site.Master' 4 5 Inherits='System.Web.Mvc.ViewPage 6 7 %> 8 9 asp:Content ID='Content1' ContentPlaceHolderID='TitleContent' 10 11 runat='server'> 12 Index 13 asp:Content> 14 15 asp:Content ID='Content2' ContentPlaceHolderID='MainContent' 16 17 runat='server'> 18 19 h2>Indexh2> 20 21 table> 22 tr> 23 th>th> 24 th> 25 Id 26 th> 27 th> 28 Title 29 th> 30 th> 31 Director 32 th> 33 th> 34 DateReleased 35 th> 36 tr> 37 38 <% foreach (var item in Model) { %> 39 40 tr> 41 td> 42 <%: Html.ActionLink('Edit', 'Edit', new { id=item.Id }) 43 44 %> | 45 <%: Html.ActionLink('Details', 'Details', new { 46 47 id=item.Id })%> | 48 <%: Html.ActionLink('Delete', 'Delete', new { 49 50 id=item.Id })%> 51 td> 52 td> 53 <%: item.Id %> 54 td> 55 td> 56 <%: item.Title %> 57 td> 58 td> 59 <%: item.Director %> 60 td> 61 td> 62 <%: String.Format('{0:g}', item.DateReleased) %> 63 td> 64 tr> 65 66 <% } %> 67 68 table> 69 70 p> 71 <%: Html.ActionLink('Create New', 'Create') %> 72 p> 73 74 asp:Content> 75 76
这个Index view 将movie数据库表所有记录显示在HTML表格。这个视图包含一个foreach循环,它遍历ViewData.Model属性所表示的每一个movie。如果你通过按F5键运行应用程序,你将会看到网页如下图所示。 ![]() 图14
创建新的数据库记录 我们在前一部分创建 的Index view 包括一个为创建新数据库记录的链接。
1 // 2 // POST: /Home/Create 3 [AcceptVerbs(HttpVerbs.Post)] 4 5 public ActionResult Create([Bind(Exclude = 'Id')] Movie movieToCreate) 6 { 7 8 if (!ModelState.IsValid) 9 10 return View(); 11 12 _db.AddToMovies(movieToCreate); 13 _db.SaveChanges(); 14 return RedirectToAction('Index'); 15 16 } 17
Visual Studio ,使它容易创建表格来创建一个新的movie数据库记录。遵循这些步骤: 1。在代码编辑窗口,右键单击Create()方法,选择菜单选项“添加视图”。 图
Listing 5 – Views\Home\Create.aspx
1 <%@ Page Title='' Language='C#' MasterPageFile='~/Views/Shared/Site.Master' Inherits='System.Web.Mvc.ViewPage 2 3 asp:Content ID='Content1' ContentPlaceHolderID='TitleContent' runat='server'> 4 Create 5 asp:Content> 6 7 asp:Content ID='Content2' ContentPlaceHolderID='MainContent' runat='server'> 8 9 h2>Createh2> 10 11 <% using (Html.BeginForm()) {%> 12 <%: Html.ValidationSummary(true) %> 13 14 fieldset> 15 legend>Fieldslegend> 16 17 div class='editor-label'> 18 <%: Html.LabelFor(model => model.Id) %> 19 div> 20 div class='editor-field'> 21 <%: Html.TextBoxFor(model => model.Id) %> 22 <%: Html.ValidationMessageFor(model => model.Id) %> 23 div> 24 25 div class='editor-label'> 26 <%: Html.LabelFor(model => model.Title) %> 27 div> 28 div class='editor-field'> 29 <%: Html.TextBoxFor(model => model.Title) %> 30 <%: Html.ValidationMessageFor(model => model.Title) %> 31 div> 32 33 div class='editor-label'> 34 <%: Html.LabelFor(model => model.Director) %> 35 div> 36 div class='editor-field'> 37 <%: Html.TextBoxFor(model => model.Director) %> 38 <%: Html.ValidationMessageFor(model => model.Director) %> 39 div> 40 41 div class='editor-label'> 42 <%: Html.LabelFor(model => model.DateReleased) %> 43 div> 44 div class='editor-field'> 45 <%: Html.TextBoxFor(model => model.DateReleased) %> 46 <%: Html.ValidationMessageFor(model => model.DateReleased) %> 47 div> 48 49 p> 50 input type='submit' value='Create' /> 51 p> 52 fieldset> 53 54 <% } %> 55 56 div> 57 <%: Html.ActionLink('Back to List', 'Index') %> 58 div> 59 60 asp:Content> 61 62
在你创建 Create 视图后,你可以添加新的Movie 记录到数据库。按下F5键运行你的应用程序和点击Create New 的链接,你将看到如图13所示的表格。如果你完成并提交表单、一个新movie数据库记录诞生了。 ![]() 注意,你自动获得表单验证。如果你忽略输入movie的发行日期,或者你输入一个无效的发布日期,那么这个表单被重新显示,并且发布日期字段将高亮显示。 在之前的部分,我们讨论了如何列举和创造新的数据库记录。在这最后一节中,我们将讨论如何修改现有的数据库记录。 完成这些步骤,将添加一个Edit.aspx的视图到Views\Home文件夹中。这一视图包含用来编辑一个movie记录的HTML表单。Edit view包含一个相应于movie Id属性的HTML表单字段。因为你不想让人们编辑这个Id属性的值,你应该移除这个表单字段。 Listing 6 – Controllers\HomeController.cs (Edit methods) 1 // 2 // GET: /Home/Edit/5 3 4 public ActionResult Edit(int id) 5 { 6 //return View(); 7 var movieToEdit = (from m in _db.Movies 8 9 where m.Id == id 10 11 select m).First(); 12 13 return View(movieToEdit); 14 15 16 } 17 18 19 [AcceptVerbs(HttpVerbs.Post)] 20 21 public ActionResult Edit(Movie movieToEdit) 22 { 23 24 var originalMovie = (from m in _db.Movies 25 26 where m.Id == movieToEdit.Id 27 28 select m).First(); 29 30 if (!ModelState.IsValid) 31 32 return View(originalMovie); 33 34 _db.ApplyCurrentValuesMovie>(originalMovie.EntityKey.EntitySetName, movieToEdit); 35 //_db.ApplyPropertyChanges(originalMovie.EntityKey.EntitySetName, movieToEdit); 36 37 _db.SaveChanges(); 38 39 return RedirectToAction('Index'); 40 41 } 42 43
在 Listing 6,我已经为2个重载的Edit()方法增添了更多的逻辑。第一个Edit()方法将返回相对应的Id传递参数的方法的movie数据库记录。第二个重载方法执行数据库中记录的更新。 ![]()
注意,你必须检索到原来的movie,然后调用ApplyCurrentValues |
|
来自: 昵称30159207 > 《数据库》