【翻译】使用ASP.NET MVC 和LINQ建立一个简单的博客 - Part 3

原文地址:Building_a_Simple_Blog_Engine_with_ASPNET_MVC_and_LINQ__Part_3
原文作者: Keyvan Nayyeri

本文地址:http://www.cnblogs.com/QLeelulu/archive/2008/03/04/1090263.html
本文作者:Q.Lee.lulu

相关链接

使用ASP.NET MVC 和LINQ建立一个简单的博客 - Part 1

使用ASP.NET MVC 和LINQ建立一个简单的博客 - Part 2

 

摘要
在本系列的第三部分中,Keyvan(原文作者) 讨论了他简单的博客的数据模型。他展示了一些数据模型中LINQ的有关概念,并在控制器中检索数据然后传递到视图。

内容

  • 简介  
  • 数据模型
  • 数据库结构
  • LINQ to SQL
  • 取数据
  • 更新控制器
  • 小结

简介

在本系列文章第一部分和第二部分中我谈了MVC模式和ASP.NET MVC Framework的一些基本东西,也讨论了MVC模式中的控制器的概念和它在ASP.NET MVC framework中的实现。

在本次的讨论中,我希望通过使用MVC框架作为一个简单的博客引擎来实现KBlog,并作为一个示例来显示ASP.NET MVC框架的相关概念。

在了解控制器和学习了有关它们的基本原理后,为了完成控制器的工作,我们需要找到一个方法来从数据模型中的数据存储器中加载数据并将它们传递给视图。

在KBlog里我使用SQL Express database的三个简单的表,过一会你就能找到它们。在本系列文章的这一部分里我会介绍MVC框架里另外一个重要的组成部分数据模型,而在控制器中,数据库结构将会使用LINQ to SQL来加载数据并从LINQ传递加载的数据到视图中。

在进入文章的正文之前让我说一下本部分的重要是在数据部分和KBlog和MVC中的数据模型概念,虽然你将在文章里看见我们的数据模型的一些最后的用途。

数据模型

数据模型是MVC模式的三个重要组成部分之一,而它负责维持状态。数据模型从数据存储器中检索数据并将数据传递给控制器。状态数据通常存储在数据存储系统中,而你可以通过几种方式来检索它们。

ASP.NET MVC框架并不在乎你的存储器系统,而你所需要做的是以某种方式将你的数据传送到控制器类中。这可以通过ADO.NET底层API例如DataReader、DataSet,或者通过LINQ to SQL类。在这里KBlog我将会使用在不久的将来将会变得普遍的LINQ to SQL(现在我们不认为它是现实世界工程普遍的东西)。

大体上,数据模型是一个作为对象来加载数据的代理类,并能将数据传递到控制器类中。为了简易很多开发者更喜欢使用一些额外的帮助类,来简化使用数据模型的工作和在一定程度上封装内部的运作。这个你将会在文章的后面看到。

数据库结构

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

图1

image001

这数据库的结构是非常明了的,每一个对博客引擎有非常基础的的认识的人都能知道这是怎么回事,所以我不浪费你的时间来叙述这个数据库。

LINQ to SQL

在KBlog我想使用一个LINQ to SQL机构来加载数据到数据模型中并传递到控制器的actions中。使用LINQ to SQL是相当容易并将会成为一个普通.NET开发者的普通知识,但是现在它是一个新的技术,就让我指出你可以添加一个新的LINQ to SQL类项目到你的ASP.NET MVC项目的Models文件夹中。如图2所示:

图 2

image002

在添加这个项到你的工程后你可以拖动数据库表到设计器中,而不需要做任何其他的东西,因为这就是我们这个示例需要的所有的东西。

你的LINQ to SQL设计器看起来应该像图3:

图 3

image003

取数据

就如我在本系列的前面的章节所说的,通常开发者喜欢使用一个隐藏内部的数据运作的代理类来装载数据。所以我创建一个类并将它命名为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<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表达式,但我不介入它们的细节,因为它们很容易阅读和理解,并超出了我们文章讨论的范围。

这里定义了四个方法:

· 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
<Post> 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
<Post> 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的源代码。

posted on 2008-03-04 21:01  Q.Lee.lulu  阅读(6320)  评论(18编辑  收藏  举报