【翻譯】使用ASP.NET MVC 和LINQ建立一個簡單的部落格 – Part 3

來源:互聯網
上載者:User

原文地址: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

這資料庫的結構是非常明了的,每一個對部落格引擎有非常基礎的的認識的人都能知道這是怎麼回事,所以我不浪費你的時間來敘述這個資料庫。

LINQ 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<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的原始碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.