摘要在这个Tip中你将学到如何创建一个自定义控制器基类让它能够为常见的数据库操作暴露一系列acton如显示插入更新和删除数据
无论什么时候你在写代码时都会发现其实你在一遍又一遍地编写着同样类型的代码现在是时候停下来考虑一下你是否正在浪费者大量的时间昨天我发现在创建一个数据库驱动的ASPNET MVC应用程序时我的确处在这样一种情形中我不得不为应用程序中的每一个数据库表进行标准的操作——显示数据更新数据插入数据删除数据一遍又一遍地编写完全相同的代码这种可怕的现象赋予我灵感让我写下了今天这篇ASPNET 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实体类
例如清单包含了一个名为HomeController的类继承自DataController类注意Movie类型被传到了DataController类中Movie类是一个LINQ to SQL实体是使用Visual Studio对象关系设计器创建的
清单 HomeControllercs
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemWeb;
using SystemWebMvc;
using TipModels;
namespace TipControllers
{
public class HomeController : DataController<Movie>
{
/**//// <summary>
/// Show Movies in a Category
/// </summary>
public ActionResult Category(int Id)
{
var results = from m in thisTable where mCategoryId == Id select m;
return View(results);
}
}
}
由于HomeController类继承自DataController类所以HomeController类自动暴露了Index()Details()Create()New()Edit()Update()和Delete()等几个action由于向DataController传递了Movie实体所以可以通过HomeController在Movie数据表上执行这些操作
在使用DataController类之前你需要向应用程序的nfig文件添加一个名为dataController的连接字符串你可以从Visual Studio对象关系设计器生成的代码中复制连接字符串并改名为dataController
要使用DataController类还需要创建一组视图你需要创建下面一组视图 Indexaspx
Detailsaspx
Createaspx
Editaspx
在明天的Tip中我会想你展示如何为所有控制器类只创建一次视图——创建共享视图不过这是明天的主题让我们回到DataController上来
不幸的是DataController太长了不适合粘贴到blog里你可以下载DataController类并试用其中的示例项目单击本文后面的链接可以下载示例代码
示例项目中包含上面列出的四个视图你可以使用示例项目来显示插入更新和删除Movies数据表中的数据记录例如图包含了Indexaspx视图生成的页面
图 Indexaspx视图
我希望当ASPNET MVC框架最终发布时能有数以百计的由开发者创建的自定义控制器基类我认为控制器基类可以用于大量不同的场景中——验证购物车产品目录等等任何时候只要你需要相应成程序中不止一次地加入一组标准操作你就有必要创建一个新的控制器基类