【翻译】Building a Simple Blog Engine with ASP.NET MVC and LINQ - Part 3

原文地址: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的源代码。

posted @ 2008-03-24 16:21 麒麟.NET 阅读(...) 评论(...) 编辑 收藏