zoukankan      html  css  js  c++  java
  • 【翻译】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的源代码。

  • 相关阅读:
    HDU1720 A+B Coming
    HDU1390 ZOJ1383 Binary Numbers
    HDU1390 ZOJ1383 Binary Numbers
    HDU2504 又见GCD
    HDU2504 又见GCD
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1020 ZOJ2478 Encoding
    HDU1020 ZOJ2478 Encoding
    HDU2097 Sky数
  • 原文地址:https://www.cnblogs.com/kirinboy/p/Building_a_Simple_Blog_Engine_with_ASPNET_MVC_and_LINQ__Part_3.html
Copyright © 2011-2022 走看看