数据库结构
KBlog的数据库结构是非常简单的。它有三个命名为Posts、Comments和Categories的表,它们有一些明显的关系,就如你所见的图1.
图1

这数据库的结构是非常明了的,每一个对博客引擎有非常基础的的认识的人都能知道这是怎么回事,所以我不浪费你的时间来叙述这个数据库。
LINK to SQL
在KBlog我想使用一个LINQ to SQL机构来加载数据到数据模型中并传递到控制器的actions中。使用LINQ to SQL是相当容易并将会成为一个普通.NET开发者的普通知识,但是现在它是一个新的技术,就让我指出你可以添加一个新的LINQ to SQL类项目到你的ASP.NET MVC项目的Models文件夹中。如图2所示:
图 2

在添加这个项到你的工程后你可以拖动数据库表到设计器中,而不需要做任何其他的东西,因为这就是我们这个示例需要的所有的东西。
你的LINQ to SQL设计器看起来应该像图3:
图 3

取数据
就如我在本系列的前面的章节所说的,通常开发者喜欢使用一个隐藏内部的数据运作的代理类来装载数据。所以我创建一个类并将它命名为KBlogDataContext来定义一些方法,将会为我装载数据对象而我可以很容易的在我的控制器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 GetCategoryPosts(string categoryName)
{
KBlogDBDataContext context = new KBlogDBDataContext();
return context.Posts.Where(
p => p.Category.Title == categoryName).ToList();
}
public List 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 GetCategories()
{
KBlogDBDataContext context = new KBlogDBDataContext();
return context.Categories.ToList();
}
}
}
注意这里我在这个示例中使用了一些简单的LINQ表达式,但我不介入它们的细节,因为它们很容易阅读和理解,并超出了我们文章讨论的范围。
这里定义了四个方法:
· GetCategoryPosts: 返回一个通过类别名来具体指定的分类的POST的列表。
· GetRecentPosts: 返回Blog最近的N个posts显示到首页中。
· GetPost: 通过标识符来返回单个post。
· GetCategories: 返回所有分类的一个列表。
虽然我可以移除这个类,但是我我强烈建议你在你的程序中按照同样的途径来为在控制器中你的数据操作获得好的封装并获得更简单和可读的代码。
更新控制器
很好。在学习了数据模型的相关知识后,现在是时候来应用数据模型方法来更新我们控制器类的实现,加载数据和传递数据到视图中去。
如果你能记起本系列文章的第二部分,我们有三个控制器类,它们里面包含有三个action方法。在这儿我们使用数据模型方法来更新它们。
第一个更新的是HomeController,这是主页action方法。更新代码在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 posts = dataContext.GetRecentPosts(10);
RenderView("Index", posts);
}
}
}
如你所见我使用KBlogDataContext类和它的GetRecentPosts方法来检索一个posts的列表然后传递给RenderView方法。RenderView是一个获得状态数据和视图名称、并传递数据到视图的方法。剩余的工作将在视图中进行处理,我们会在将来的文章部分找到。
第二个控制器是CategoriesController,我们在这里检索一个具体指定的类别的所有posts的数据。更新的代码如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 posts = dataContext.GetCategoryPosts(name);
RenderView("Category", posts);
}
}
}
最后一个控制器是PostsController ,加载单独的post数据并传递给对应的视图。(Liting 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框架的系列文章的第三部分是全部关于MVC模式的数据模型组件的。首先给你介绍了数据模型,然后对数据库结构进行了概述,在这之后,你看到了一个使用LINQ to SQL来加载数据的快速的概览,而下一个主题则是应用这个在数据模型中来从数据库中取数据,最后在控制器中使用数据模型来传递数据到视图中。
在后面的部分你会读到更多关于单元测试、视图和URL routing。
在下一部分我会为所有想尝试自己写代码的人公布KBlog的源代码。
来源:http://www.cnblogs.com/QLeelulu