原文地址: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。
--------
哎,無奈的廣告:[.NETRegex庫] http://regex-lib.net/。歡迎大家把自己常用的、用過的正則添加進來。