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

  • 相关阅读:
    【Nginx】开启 gzip和缓存
    webpack分离css单独打包
    【转】为什么Github没有记录你的Contributions
    Swiper使用遇到的问题
    Jenkins 自动化构建
    Pre标签 自动换行
    Gulp入门教程
    计数排序
    直接插入排序
    等差素数列
  • 原文地址:https://www.cnblogs.com/kirinboy/p/Building_a_Simple_Blog_Engine_with_ASPNET_MVC_and_LINQ__Part_3.html
Copyright © 2011-2022 走看看