原文地址:Building a Simple Blog Engine with ASP.NET MVC and LINQ - Part 3
摘要
在本系列的第三篇,Keyvan讨论了blog引擎中的数据模型,这些模型从Controller中获得数据并传递到View。他借助截图和代码,向我们展示了数据模型中LINQ方面的相关概念。
内容
- 简介
- 数据模型
- 数据库结构
- LINQ to SQL
- 获取数据
- 更新Controller
- 小结
简介
在本系列的第一和第二部分中,我讨论了MVC模式的基础、ASP.NET MVC Framework、Controller的概念及其在ASP.NET MVC Framework中的实现。
在本文中,我将用ASP.NET MVC Framework实现KBlog,并以此为例介绍相关概念。
在学习完Controller的基本概念之后,我们需要找到一种途径将数据存储系统中的数据加载到数据模型,并传递到View以结束Controller的工作。
在KBlog中,我使用了SQL Express数据库,并设计了三个简单的表(稍后将看到)。本文将向你介绍数据库结构和MVC模式中的另一个主要组件——数据模型,并且将使用LINQ to SQL加载数据并传递到View。
在进入到文章主体之前,我需要声明,尽管你会看到一些数据模型的最终应用,本文的重点仍然是KBlog和MVC中的数据端和数据模型的概念。
数据模型
数据模型是MVC模式中三个主要的概念之一,其职责是声明状态。数据模型从数据存储系统获取数据,并将其传递给Controller。通常情况下状态数据存储在数据库系统中,有几种途径可以得到它们。
ASP.NET MVC Framework并不关心你的存储系统,你所要做的只是将数据传递给Controller。你可以通过ADO.NET的低级API如DataReader或DataSet,或通过LINQ to SQL类。这里我们使用LINQ to SQL。
通常情况下数据模型是代理类,以对象的形式加载数据并传递给Controller类。为了方便,很多开发者选择使用Helper类,它简化了数据模型的工作,并且在某种程度上封装了内部工作。稍后你将看到。
数据库结构
KBlog的数据库结构非常简单。它包含三个表,Posts、Comments和Categories。它们之间的关系显而易见。
图1
数据库结构一目了然,只要多Blog引擎有基本的了解就可以明白,因此不再赘述。
LINQ to SQL
在KBlog中,我打算使用LINQ to SQL机制向数据模型中加载数据并传递。使用LINQ to SQL非常简单,并且应该称为.NET开发者的必备知识。但由于是一项新技术,还是有必要介绍。在ASP.NET MVC项目中的Models文件夹中新建LINQ to SQL Classes项,如图2所示。
图2
添加完该项后,你可以向设计器中拖拽数据库表并且无需其它操作,作为本例来说,这样做就足够了。
你的LINQ to SQL设计器形如图3所示。
获取数据
正如本文前面所提到的,开发者通常倾向于使用代理类来隐藏内部数据加载的工作,因此我创建一个名为KBlogDataContext的类,并定义一些加载数据对象的方法,这样就可以在Controller的Action方法中随意使用。
该类中的方法使用LINQ to SQL对象和LINQ声明来加载数据。其代码如Listing 1所示。
Listing 1
using System; using System.Data; using System.Linq; using System.Collections.Generic; namespace KBlog.Models { public class KBlogDataContext { public List<Post> GetCategoryPosts(string categoryName) { KBlogDBDataContext context = new KBlogDBDataContext(); return context.Posts.Where( p => p.Category.Title == categoryName).ToList(); } public List<Post> GetRecentPosts(int count) { KBlogDBDataContext context = new KBlogDBDataContext(); return context.Posts.Take( count).OrderByDescending(p => p.PublishedDate).ToList(); } public Post GetPost(int id) { KBlogDBDataContext context = new KBlogDBDataContext(); return context.Posts.Where(p => p.ID == id).Single(); } public List<Category> GetCategories() { KBlogDBDataContext context = new KBlogDBDataContext(); return context.Categories.ToList(); } } }
注意,代码中有一些简单的LINQ表达式,而我不准备对其进行详细介绍,因为它十分浅显,并且也超出了本系列的讨论范围。
代码中共有4个方法:
- GetCategoryPosts:通过类别名称返回属于该类别的文章列表。
- GetRecentPosts:返回用来显示在首页的最近N篇文章。
- GetPost:通过主键返回单独一篇文章。
- GetCategories:返回所有类别的列表。
尽管这样做不是必须的,但我仍强烈建议在应用程序中按照这样的方式组织,以便对数据操作进行良好的封装,并使Controller中的代码简单易读。
更新Controller
非常好!学习完数据模型后,现在到了更新Controller类的时候了。我们修改其实现,使其应用数据模型的方法,并加载和传递数据。
在本系列的第二篇,我们创建了三个包含三个Action方法的Controller类,现在我们使用数据模型方法对其进行更新。
我们首先更新HomeController类及其Index方法。修改后的代码如Listing 2所示。
Listing 2
using System; using System.Web; using System.Web.Mvc; using KBlog.Models; using System.Collections.Generic; namespace KBlog.Controllers { public class HomeController : Controller { // Sample URL: /Default.aspx [ControllerAction] public void Index() { KBlogDataContext dataContext = new KBlogDataContext(); List<Post> posts = dataContext.GetRecentPosts(10); RenderView("Index", posts); } } }
如你所见,我使用KBlogDataContext类及其GetRecentPosts方法获取文章列表,并传递到RenderView方法。RenderView方法得到状态数据和视图名称并将数据传递给视图。其它的将在视图中进行处理,我们将在后续文章中讨论。
第二个Controller是CategoriesController,它负责获取属于某类别的全部文章数据。修改后的代码如Listing 3所示。
Listing 3
using System; using System.Web; using System.Web.Mvc; using KBlog.Models; using System.Collections.Generic; namespace KBlog.Controllers { public class CategoriesController : Controller { // Sample URL: /Category/DotNet [ControllerAction] public void Category(string name) { KBlogDataContext dataContext = new KBlogDataContext(); List<Post> posts = dataContext.GetCategoryPosts(name); RenderView("Category", posts); } } }
最后一个Controller是PostsController,它加载单独的文章数据并传递给恰当的View(Listing 4)。
Listing 4
using System; using System.Web; using System.Web.Mvc; using KBlog.Models; using System.Collections.Generic; namespace KBlog.Controllers { public class PostsController : Controller { // Sample URL: /Post/25 [ControllerAction] public void Post(int id) { KBlogDataContext dataContext = new KBlogDataContext(); Post post = dataContext.GetPost(id); RenderView("Post", post); } } }
唯一你想问的可能是RenderView方法和与视图相关的内容。我们将在后面的文章中介绍视图的相关细节,因此不必担心。
小结
ASP.NET MVC Framework系列的第三篇是介绍了数据模型组件。首先介绍了数据模型并给出了数据库结构。接下来快速浏览了使用LINQ to SQL加载数据的过程。然后在数据模型中使用LINQ to SQL,获取数据库中的数据。最后在Controller中使用数据模型来向View传递数据。
后续文章将更多的介绍单元测试、View以及URL Routing。
下一篇文章中我将向大家发布KBlog的源代码。