【翻譯】Building a Simple Blog Engine with ASP.NET MVC and LINQ – Part 3

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.