原文地址: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的原始碼。