【翻译】使用ASP.NET MVC 和LINQ建立一个简单的博客 - Part 2

原文地址:Building_a_Simple_Blog_Engine_with_ASPNET_MVC_and_LINQ__Part_2
by Keyvan Nayyeri

译注:本来想等别人翻译,见没人翻译,就利用中午休息的一点时间来翻译的,本来E文就不是很好,又匆忙,大家就将就着看吧。J .下午下班就可以回家过年拉。

感觉这系列文章前面部分的都很简单,建议大家直接去Scott Guthrie的博客看看他写关于MVC的文章。

摘要
在本系列关于ASP.NET MVC Framework的文章第二部分中,Keyvan(原文作者)在他的博客引擎中添加了控制器(controller),为了更好的讲述怎样在ASP.NET MVC Framwork使用控制器和讨论了控制器的相关细节。他首先论述了URL路由(routing)模式的概念,然后深入剖析控制器类,最后研究控制器如何在他的示例博客程序中实现。

内容

  • 简介
  • 默认URL路由模式
  • 剖析控制器类
  • Action方法
  • Action方法中的参数
  • 实现KBlog的控制器
  • 小结

简介

在本系列关于ASP.NET MVC Framework的文章第一部分中,我对Model View Controller (MVC)模式、ASP.NET MVC和我将要建造的该示例博客的结构做了个简短的介绍,我将该博客命名为KBlog。
在本第二部分中,我将会主要讲述MVC模式三个主要要素之一:控制器。
控制器是MVC模式最常见的元素,他负责处理用户的输入和执行适当的代码来装载数据并显示给用户。
虽然这不是100%正确的定义,但你可以认为控制器就是用户和视图(View)的中间组件,它试图处理用户的输入并显示适当的输出给他或她。
通常,你在WEB程序使用一些模板文件来处理不同的请求。这意味着你有一个命名为Post.aspx的页面来处理post的请求,其他页面也类似。在MVC Framework中这是不同的,而你将使用控制器来处理请求。换句话说,你不再用.aspx页面来处理用户请求,而是写控制器类来处理请求并将适当的数据传给视图页来显示给最终用户。
但控制器类是怎样接受请求的呢?要做到这点,ASP.NET使用了一个RUL路由结构通过路径来路由进入的请求到合适的控制器类中。ASP.NET MVC Framework有一个默认定义的路由,但是你可以改变成你需要的形式,我会在本系列文章中为KBlog实现这点。我会讨论路由结构在后面的部分,但在本部分中我会对必要的部分做个概述。
在本篇文章中我会讨论的另外一个主题是剖析控制器类和他们的结构以及Action方法和怎样传递参数给Action方法并为他们路由请求。

默认URL路由模式

在ASP.NET MVC Framework中的路由结构有一个默认的路由模式,你可以修改它。这个结构可以在ASP.NET应用程序类(Global.asax文件)中修改。 但在这我并不在乎这路由结构的详细信息和怎样去修改他。在本系列后面的文章我会此做详细的讨论,但我只是快速的说一下默认的路由模式。 默认情况下,ASP.NET MVC Framework路由请求/URL/ 路径到命名为URLController的控制器类中。例如,默认情况下请求访问/Post/的URL将会被路由到PostController类中。 此外,所有请求URL是在/URL/ 路径下的也将会被路由到UrlController类中。例如,请求访问/Post/Technology/Surface将被路由到PostController类中

剖析控制器类
控制器类就是一个类,跟其他类一样,它不是必须要继承自某一个特别的类或者实现某个接口,但推荐继承自一个System.Web.MVC.Controller基控制器类,来获得该基类的优势。控制器类提供一些方法来协助你开发ASP.NET MVC应用程序,我想没有哪位开发者会回避使用它。 你可以添加一个新的MVC控制器类文件在添加新项对话框中,如图一所示:
1

清单1显示了被我命名为SampleController的控制器类的默认代码:
清单 1
using System;
using System.Web;
using System.Web.Mvc;  

namespace KBlog.Controllers
{
  public class SampleController : Controller
    {
        [ControllerAction]
        public void Index()
        {
            //Add action logic here 
        }
    }
}

如你所见,这儿引入了你机器中的System.Web.Mvc命名空间,该命名空间是在ASP.NET 3.5扩展中的,而且该类也继承自Controller基类


Action 方法

控制器类的主要部分是他的Action方法。Action方法只是一些public的方法并没有返回任何东西,并用[ControllerAction]特性(attribute)标记该方法是一个Action方法。 那Action方法的职责是什么呢?一个Action方法接收一个请求并触发相应的逻辑从数据模型中取得数据并将该数据送到视图中,来为最终用户显示相应的结果。因此Action方法就像控制器类的心脏。 那Action是怎样工作的呢?Action方法是在传递给他们的参数的基础上工作的。显然,URL描述了用户所请求的内容,而路由机构路由每一个请求到合适的控制器类中。但在这儿,参数指定哪个Action方法将会用来处理。 例如,当用户正在访问一个像/Post?ID=5这样的页面,然后该请求会被路由到PostController类中,在那PostController类中的Action方法通过一些方式来处理该请求。
清单2在清单1中加了一个Action方法:
清单 2
using System;
using System.Web;
using System.Web.Mvc;

 namespace KBlog.Controllers
{
    public class SampleController : Controller
    {
        [ControllerAction]
        public void Index()
        {
            //Add action logic here
        }
    }
}

默认情况下,在ASP.NET MVC项目中会有一个HomeController类来处理到默认Home pages的请求。
在下一节我会讨论更多有关Action方法中的参数。


Action 方法中的参数

参数是控制器类的关键部分,他指定了用户选择的Action方法。参数直接从URL和它的查询字符串中传过来,而你要决定怎样在你的逻辑中使用它们。 在Action方法中有不同的方式来处理参数,而这由你来决定怎样去做。 第一种途径是使用查询字符串并在Action方法中把它们从URL中提取出来。显然,这种做法并不用为Action方法提供任何参数。清单3显示了一个Action方法从查询字符串中取得ID参数。 
清单 3
// Sample URL: /Page/Article?ID=5
[ControllerAction]
public void Article()
{
    int id = Convert.ToInt32(Request["ID"]);
}

 

第一种途径你可以在所有的ASP.NET web应用程序中做到。第二中途径是你传给Action方法的URL参数,是确定的类型,作为它(Action方法)的参数。
清单4显示了实现途径的一个示例,你可以在你的Action方法中简单的使用ID参数来写你自己的逻辑。

清单 4:
// Sample URL: /Page/Article?ID=5
[ControllerAction]
public void Article(int id)
{
    // Implement the logic to handle the
    // request based on the id parameter
}

 

 最后一种方法跟前面一个很像。你通过Action方法的参数来处理参数,但是参数也是来自子路径。所以如果你有一个像/Page/Article/5的URL,那么5将会被认为是ID参数而传给控制器类。 清单5显示在Action中的该情况:
清单 5:
// Sample URL: /Page/Article/5
[ControllerAction]
public void Article(int id)
{
    // Implement the logic to handle the 
    // request based on the id parameter
}

 

你可以使用可空类型参数来为Action方法传递供选择的参数。例如,假设你有一篇由几章节组成的文章,一种案例用户可以请求整篇文章,而另一种案例中,用户也可以传递一个章节的唯一的标题参数来取得指定的章节。
清单6就显示这个是如何实现的。

清单 6:
// Sample URL 1: /Page/Article/5
// Sample URL 2: /Page/Article/5?section=introduction
[ControllerAction]
public void Article(int id, string? section)
{
    // Implement the logic to handle the request
    // based on the id and/or section parameters
}


实现 KBlog的控制器

现在我们已经熟悉了控制器类、Action方法和Action方法参数的原理,我们可以更新我们的代码,在KBlog中实现它们。
在KBlog中我们需要三个控制器(在这里我们只是想建立一个非常简单的博客引擎来说明一些概念)

  • Homepage,也就是我们首页的控制器:我们在所有类别中取得最近的N篇posts的列表
  • 个人Posts控制器:我们通过指定的post ID来装载数据
  • 个人类别控制器:我们通过指定类别唯一的名称来装载所有的posts

清单7是homepage中HomeController类的代码,我们不需要为他传递任何参数。以后我会更新这个控制器来装载最近的posts和所有的类别,并传递给相应的视图。现在,只是着眼于控制器部分的代码。
清单 7:
using System;
using System.Web;
using System.Web.Mvc;  
namespace KBlog.Controllers
{
    public class HomeController : Controller
    {
        // Sample URL: /Default.aspx
        [ControllerAction]
        public void Index()
        {  

        }
    }
}

 

另外一个控制器是PostController,在其中我们通过唯一的ID来处理个人posts的请求(清单8).注意,为了将请求路由到该控制器,以后我们要修改默认的路由定义。
清单 8:
using System;
using System.Web;
using System.Web.Mvc;

namespace KBlog.Controllers
{
    public class PostsController : Controller
    {
        // Sample URL: /Post/25
        [ControllerAction]
        public void Post(int id)
        {  

        }
    }
} .

 

最后一个控制器是CategoriesController,在其中我们通过唯一的字符串名来处理个人类别的请求,并装载该类别中所有的posts(清单9).跟PostsController一样我们需要修改默认的路由定义,将请求路由到该控制器中。
清单 9:
using System;
using
System.Web;
using
System.Web.Mvc;
namespace KBlog.Controllers

{
    public class CategoriesController : Controller
    {
        // Sample URL: /Category/DotNet
        [ControllerAction]
        public void Category(string name)
        {  

        }
    }
}


总结

在我关于ASP.NET 3.5 MVC Framework文章的第二部分中,我讨论了控制器,MVC模式中的一个主要的部分。
在后面的部分中我将会讨论MVC应用程序中的模型、视图、单元测试、URL routing和其他相关理念。

posted on 2008-02-01 15:25  Q.Lee.lulu  阅读(2951)  评论(7编辑  收藏  举报