Building a Simple Blog Engine with ASP.NET MVC and LINQ - Part 3
 
Published: 03 Mar 2008
Abstract
In the third part of this series, Keyvan talks about the data model in his simple blogging engine. He shows some concepts related to the LINQ side of the data model to retrieve data for the blogging engine in controllers and pass them to views with the help of screenshots and source code.
by Keyvan Nayyeri
Feedback
Average Rating: This article has not yet been rated.
Views (Total / Last 10 Days): 53524/ 80

Introduction

In the first and second parts of this article series I talked about the fundamentals of the Model View Controller (MVC) pattern and the ASP.NET MVC framework as well as the controller concept in the MVC pattern and its implementation in the ASP.NET MVC framework.

Moving on in this discussion, I want to implement KBlog with the MVC framework as a simple blog engine and show the concepts related to the ASP.NET MVC framework by using it as an example.

After getting started with controllers and learning the basics about them, we need to find a way to load data from data storage in data model and pass them to views in order to finalize the work on controllers.

For KBlog I'm using a SQL Express database with three simple tables that you'll discover in a moment. In this part of the article series I introduce you to the data model as the other main component in Model View Controller (MVC) framework and the database structure then will use LINQ to SQL to load data and pass the loaded data from LINQ to views in controllers.

Before stepping in the main body of the article let me say that this part focuses on the data side and data model concepts of the KBlog and MVC even though you'll see some final uses of our data model in the article.

Data Model

Data model is one of the main three components of MVC pattern and is actually responsible to maintain the state. Data model retrieves data from data storage systems and passes the data to controllers. Often the state data is stored in database storage system and you can retrieve them in several ways.

ASP.NET MVC framework doesn't care about your storage system and all you need to do is pass your data to the controller classes somehow. This may be via lower level APIs of ADO.NET like DataReader or DataSet or via LINQ to SQL classes. Here for KBlog I'll use LINQ to SQL which will become common in the near future (if we don't consider it as something common for real world projects right now).

In general the data model is a proxy class that loads data as objects and can pass them to controller classes. For simplicity many developers prefer to use some extra helper classes that simplify the work with the data model and encapsulate the inner workings to some extent. You'll see this later in this article.

Database Structure

The structure of the KBlog database is very simple. It has three tables named Posts, Comments, and Categories that have some obvious relationships as you see in Figure 1.

Figure 1

The structure of this database is self-explanatory and anyone with a very basic understanding of blogging engines can find what's going on here so I won't waste your time with any description about the database.

LINQ to SQL

For KBlog I want to use a LINQ to SQL mechanism to load data to the data model and pass them to controller actions. Using LINQ to SQL is pretty easy and should be common knowledge for a normal .NET developer, but since it's a new technology just let me point that you can add a new LINQ to SQL Classes item to your Models folder in ASP.NET MVC project as shown in Figure 2.

Figure 2

After adding this item to your project you can drag and drop database tables to the designer and don't need to do anything else because this is all we need for this example.

Your LINQ to SQL designer should look like Figure 3 after that.

Figure 3

Fetch Data

As I stated in the previous sections of this article, usually developers prefer to use a proxy class to hide the inner data workings that lead to loading data so I create a class and name it KBlogDataContext to define a few methods that will load the data objects for me and I can apply them in my controller action methods easily.

Methods included in this class use my LINQ to SQL objects and LINQ statements to load data. The code for this class is shown in 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();
        }
    }
}

Note that there are some simple LINQ expressions that I used for this example, but I don't step in their details because they're easy to read and understand and move us beyond the scope of this article series.

There are four methods defined here:

·         GetCategoryPosts: Returns a list of posts for a specified category based on the category name.

·         GetRecentPosts: Returns recent N posts of the blog to be shown in the homepage.

·         GetPost: Returns a single post based on its identifier.

·         GetCategories: Returns a list of all categories.

Even though I could get rid of this class I strongly recommend you follow the same approach in your applications to have good encapsulation for your data operations and have simpler and more readable code in controllers.

Update the Controllers

Very well! After learning about the data model, now it's time to update our implementation of controller classes to apply the data model methods and load data and pass the data to views.

If you can remember from the second part of this series, we had three controller classes with three action methods included in them. Here we updated them to use data model methods.

First controller to update is the HomeController and its Index action method. The updated code is presented in 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);
        }
    }
}

As you see I used the KBlogDataContext class and its GetRecentPosts method to retrieve a list of posts and pass them to RenderView method. RenderView is a method that gets state data and a view name and passes the data to view. The rest will be done in views that we'll discover in future article parts.

The second controller is CategoriesController where we retrieve the data for all the posts in a specified category and the updated code is shown in 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);
        }
    }
}

The last controller is PostsController that loads data for an individual post and passes it to the appropriate 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);
        }
    }
}

The only thing that you may ask about is the RenderView method and stuff related to views. Hopefully we will cover views in more details in next parts so don't worry about them!

Previous Articles in this series

Summary

This third part of my article series about ASP.NET MVC framework was all about the data model component of the pattern. First it introduced you to the data model then gave a general description about the database structure. After that, you saw a quick overview of the process of using LINQ to SQL to load data. The next topic was applying these to fetch data from the database in a data model and finally using the data model in controllers to pass data to views.

In the future parts you'll read more about unit testing, views, and URL routing.

From the next part I'll publish the source code of KBlog for everyone who wants to get his hands on the code.



User Comments

Title: 2012 NFL jerseys   
Name: NIKE NFL jerseys
Date: 2012-05-20 11:28:39 PM
Comment:
[/pre]Cheap NFL,NBA,MLB,NHL
[url=http://www.jersey2shop.com/]Jerseys From China[/url]
[url=http://www.jersey2shop.com/]2012 nike nfl Jerseys[/url]
[url=http://www.jersey2shop.com/]cheap China Jerseys[/url]
[url=http://www.jersey2shop.com/]Sports Jerseys China[/url]
[url=http://www.jersey2shop.com/NFL-Jerseys-c68/]NFL Jerseys China[/url]
[url=http://www.jersey2shop.com/NBA-Jerseys-c77/]NBA Jerseys China[/url]
NHL Jerseys China
[url=http://www.jersey2shop.com/MLB-Jerseys-c94/]MLB Jerseys China[/url]NFL jerseys For Sale online.All Our Jerseys Are Sewn On and Directly From Chinese Jerseys Factory
[/pre]
[pre]We Are Professional China jerseys Wholesaler
[url=http://www.cheapjersey2store.com/]Wholesale cheap jerseys[/url]Cheap mlb jerseys
[url= http://www.cheapjersey2store.com/]2012 mlb all atar jerseys[/url]
[url= http://www.cheapjersey2store.com/ [/url]Cheap China Wholesael[/url]
[url= http://www.cheapjersey2store.com/]Wholesale jerseys From China[/url]
[url=http://www.cheapjersey2store.com/]2012 nike nfl Jerseys[/url]Free Shipping,Cheap Price,7 Days Deliver
[/pre]
[/pre]
We are professional jerseys manufacturer from china,wholesal
sports [url= http://www.cheapjersey2store.com/]Jerseys From China[/url]
[url=http://www.cheapjersey2store.com/NFL-Jerseys-c68]NFL jerseys China[/url]
[url=http://www.cheapjersey2store.com/NHL-Jerseys-c96/]NHL Jerseys China[/url]
[url=http://www.cheapjersey2store.com/NBA-Jerseys-c77/]NBA Jerseys China[/url]
[url=http://www.cheapjersey2store.com/MLB-Jerseys-c94/]MLB Jerseys China[/url]
[url= http://www.cheapjersey2store.com/]China Jerseys[/url],Free Shipping
[/pre]
[/pre]
We are professional jerseys manufacturer from china,wholesal
sports [url= http://www.jerseycaptain.com/]cheap jerseys sale online [/url]
[url= http://www.jerseycaptain.com/]2012 nike nfl Jerseys[/url]
[url=http://www.jerseycaptain.com/NFL-Jerseys-c68]cheap NFL jerseys China[/url]
[url=http://www.jerseycaptain.com/NHL-Jerseys-c96/]NHL Jerseys C
Title: grignolino   
Name: tomy.algoria@gmail.com
Date: 2010-03-09 6:03:43 AM
Comment:
This blog contains really good stuff.Thanks for sharing this interesting blog.
Title: Microsoft Training Word   
Name: Tuzigoot
Date: 2010-01-29 1:26:58 AM
Comment:
Looks like an Ebook that you can get something better idea.
Title: Quality SEO Services   
Name: Lurus
Date: 2010-01-29 1:25:42 AM
Comment:
This article gave me better idea on how implement such things something like this.
Title: Quality SEO Services   
Name: Lurus
Date: 2010-01-29 1:25:20 AM
Comment:
This article gave me better idea on how implement such things something like this.
Title: Agenzia Web Marketing   
Name: Agenzia Web Marketing
Date: 2009-12-09 5:55:22 AM
Comment:
Good Post.It's really helpful and interesting
Title: Commentary   
Name: maria tere
Date: 2009-04-22 9:49:51 AM
Comment:
i think the example of LINQ to SQL is very poor, because the use of that class is more extensible.
Title: Busby SEO Test   
Name: info@gmail.com
Date: 2008-12-22 12:07:27 AM
Comment:
thank you very much
Title: Question   
Name: Michael
Date: 2008-12-06 6:31:47 AM
Comment:
Hi, how about if our sample url is '/2008/12/06/post-title-here' just like what Wordpress did, is it possible?
Title: Nevermind   
Name: Nick Kirkes
Date: 2008-04-26 7:07:31 PM
Comment:
Just realized I am missing the DBDataContext.
Title: context.Posts?   
Name: Nick Kirkes
Date: 2008-04-26 7:06:44 PM
Comment:
Thanks for the article.

I'm following your guidance, but I can't build as the "context.Posts" don't exist (same for categories). Am I missing something?
Title: anxiously awaiting...   
Name: Emiel
Date: 2008-04-24 3:06:02 AM
Comment:
Here's another one waiting for part 4...
When, when, WHEN?
Title: And the part 4?   
Name: lxx
Date: 2008-04-17 11:42:43 AM
Comment:
I wait for your next artical.Thanks.
Title: Reply to Mike   
Name: Keyvan Nayyeri
Date: 2008-03-28 8:53:51 AM
Comment:
Mike,

I'll send it to editorial team in the next three days so I expect it to be published in the next couple of weeks.
Title: Expectation?   
Name: Mike Mayers
Date: 2008-03-28 8:45:08 AM
Comment:
Is there any prevision about the release of the 4th part? Can't wait to see it. Very nice.
Title: Very good!!!!!   
Name: Marcelo
Date: 2008-03-27 4:35:06 PM
Comment:
Very good tutorial! Am waiting anxiously for the "View" part!!! Thank you.

Product Spotlight
Product Spotlight 





Community Advice: ASP | SQL | XML | Regular Expressions | Windows


©Copyright 1998-2024 ASPAlliance.com  |  Page Processed at 2024-03-19 3:24:29 AM  AspAlliance Recent Articles RSS Feed
About ASPAlliance | Newsgroups | Advertise | Authors | Email Lists | Feedback | Link To Us | Privacy | Search