[翻译] ASP.NET MVC Tip #4 - 创建自定义数据控制器基类

原文地址:http://weblogs.asp.net/stephenwalther/archive/2008/06/18/asp-net-mvc-tip-4-create-a-custom-data-controller-base-class.aspx

摘要:在这个Tip中,你将学到如何创建一个自定义控制器基类,让它能够为常见的数据库操作暴露一系列acton,如显示、插入、更新和删除数据。

无论什么时候,你在写代码时都会发现其实你在一遍又一遍地编写着同样类型的代码,现在是时候停下来考虑一下你是否正在浪费者大量的时间。昨天,我发现在创建一个数据库驱动的ASP.NET MVC应用程序时,我的确处在这样一种情形中。我不得不为应用程序中的每一个数据库表进行标准的操作——显示数据、更新数据、插入数据、删除数据。一遍又一遍地编写完全相同的代码,这种可怕的现象赋予我灵感,让我写下了今天这篇ASP.NET MVC Tip。

MVC控制器就是一个类(Visual Basic或C#类)。既然是类,就可以支持继承。因此,如果你发现你正在为控制器action编写重复的代码,就有必要编写一个新的基类了,让它包含一组常见的action。在这个Tip中,我们一起来创建一个数据控制器基类,它能够执行标准的数据库操作。要记住,你也可以为其他类型的常见控制器action编写基类。

我建立了一个名为DataController的控制器基类。该类提供了下列公共方法:

  • Index()——显示一个数据表中所有的数据记录
  • Details()——显示数据库表中的一条数据记录
  • Edit()——显示一个视图,其中包含一个用于编辑现有数据记录的窗体
  • Update()——更新数据库中的数据记录
  • New()——显示一个视图,用于插入新的数据库记录
  • Insert()——向数据库中插入一条新的数据记录
  • Delete()——从数据库中删除一条现有记录

由于这些方法都是公共的,所以每个方法都会暴露为一个action。你只要在Web浏览器地址栏中输入正确的URL,就能调用这些方法。

DataController还包含一些受保护的方法:

  • DBSave()——插入或更新数据库记录
  • DBInsert()——插入新的数据库记录
  • DBUpdate()——更新现有的数据库记录
  • DBDelete()——删除现有的数据库记录
  • DBGet()——获取单独一条数据库记录

由于这些方法是受保护的,所以他们不能通过URL调用。然而,你可以在派生类中调用这些方法。这些都是有用的工具方法,你可以通过调用这些方法来实现派生类的控制器action方法。

最后,DataController类还提供了下列方法:

  • DataContext——LINQ to SQL数据上下文
  • Table——LINQ to SQL表
  • IdentityColumnName——数据表中包含的标识列

这些属性也是受保护的。你可以在派生类中使用它们,但他们不会被暴露为控制器action。

DataController类是一个泛型类。当你从DataController类继承一个控制器时,必需指定数据实体的类型。DataController类与LINQ to SQL一起工作。在使用DataCotroller类之前,必须先创建表示数据库对象的LINQ to SQL实体类。

例如,清单1包含了一个名为HomeController的类,继承自DataController类。注意Movie类型被传到了DataController类中。Movie类是一个LINQ to SQL实体,是使用Visual Studio对象关系设计器创建的。

清单1 - HomeController.cs

 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Web;
 5using System.Web.Mvc;
 6 
 7using Tip4.Models;
 8 
 9namespace Tip4.Controllers
10{
11    public class HomeController : DataController<Movie>
12    {
13 
14        /// <summary>
15        /// Show Movies in a Category
16        /// </summary>

17        public ActionResult Category(int Id)
18        {
19            var results = from m in this.Table where m.CategoryId == Id select m;
20            return View(results);
21        }

22 
23 
24    }

25}

由于HomeController类继承自DataController类,所以HomeController类自动暴露了Index()、Details()、Create()、New()、Edit()、Update()和Delete()等几个action。由于向DataController传递了Movie实体,所以可以通过HomeController在Movie数据表上执行这些操作。

在使用DataController类之前,你需要向应用程序的web.config文件添加一个名为dataController的连接字符串。你可以从Visual Studio对象关系设计器生成的代码中复制连接字符串并改名为dataController。

要使用DataController类,还需要创建一组视图。你需要创建下面一组视图:

  • Index.aspx
  • Details.aspx
  • Create.aspx
  • Edit.aspx

在明天的Tip中,我会想你展示如何为所有控制器类只创建一次视图——创建共享视图。不过这是明天的主题。让我们回到DataController上来。

不幸的是DataController太长了,不适合粘贴到blog里。你可以下载DataController类,并试用其中的示例项目。单击本文后面的链接可以下载示例代码。

示例项目中包含上面列出的四个视图。你可以使用示例项目来显示、插入、更新和删除Movies数据表中的数据记录。例如,图1包含了Index.aspx视图生成的页面。

图1 - Index.aspx视图


我希望当ASP.NET MVC框架最终发布时,能有数以百计的由开发者创建的自定义控制器基类。我认为控制器基类可以用于大量不同的场景中——验证、购物车、产品目录等等。任何时候只要你需要相应成程序中不止一次地加入一组标准操作,你就有必要创建一个新的控制器基类。 

此处下载源代码:http://weblogs.asp.net/blogs/stephenwalther/Downloads/Tip4/Tip4.zip

--------

哎,无奈的广告:[.NET正则表达式库] http://regex-lib.net/。欢迎大家把自己常用的、用过的正则添加进来。

posted @ 2008-07-08 11:28  Anders Liu  阅读(2962)  评论(9编辑  收藏  举报