ASP.Net MVC開發基礎學習筆記(5):區域、模板頁與WebAPI初步

發表於2015-03-17

一、區域—麻雀雖小,五臟俱全的迷你MVC專案

1.1 Area的興起

為了方便大規模網站中的管理大量檔案,在ASP.NET MVC 2.0版本中引入了一個新概念—區域(Area)。


在專案上右擊建立新的區域,可以讓我們的專案不至於太複雜而導致管理混亂。有了區域後,每個模組的頁面都放入相應的區域內進行管理很方便。例如:上圖中有兩個模組,一個是Admin模組,另一個是Product模組,所有關於這兩個模組的控制器、Model以及檢視都放入各自的模組內。可以從上圖中看出,區域的功能類似一個小的MVC專案,麻雀雖小五臟俱全,有自己的控制器、模型、檢視還有路由設定
區域實際上是應用程式內部的一個 MVC 結構,一個應用程式可能包含若干個 MVC 結構(區域)。例如:一個大型電子商務應用程式可能分為若干個區域,這些區域表示店面、產品檢查、使用者帳戶管理和採購系統。每個區域表示整個應用程式的一個獨立功能。

1.2 註冊區域路由

在MVC中新增一個Area區域之後,會預設幫我們註冊這個區域的路由規則。例如:我們建立了一個Admin的區域,然後它幫我們生成了一個AdminAreaRegistration.cs的檔案,其程式碼如下:

這裡,RegisterArea是實現註冊的關鍵方法,通過把另一個路由新增到區域路由集合中實現。請注意,這裡的區域名Admin是以硬編碼方式新增到URL中;因此,所有使用此區域名稱作為字首的請求都被進行特別路由處理。

你可能感到疑惑:為什麼我們不能在主應用程式的路由定義中指定Admin部分?實際上,如果我們將它加入到標準的路由表中,而不通過區域上下文(AreaRegistrationContext),那麼我們還是把所有檔案駐留到同一個專案中,從而失去了分離專案區域的好處(即區域沒有起到作用)。

二、模板頁—封裝頁面變化點,構建快速View開發模板

在傳統的WebForm開發模式中,我們使用MasterPage作為模板頁。那麼在MVC3 Razor檢視設計中,我們怎麼來使用模板頁呢?

2.1 模板頁的歸宿—Shared資料夾

在解決方案資源管理中,我們可以看到Views資料夾下面有一個Shared資料夾。在Shared資料夾裡面有一個_Layout.cshtml頁面。這個就是專案中預設的模板頁面,如下圖所示:

在Shared中新建一個MVC佈局頁,取名為:_MyLayout.cshtml

其中RenderSection為渲染指定區域,該區域名稱為Head,但不是必須渲染(required:false)。而RenderBody則是重頭戲,他就類似於MasterPage中主內容的PlaceHolder,是每個使用該模板頁都需填充的內容區域。

那麼,怎麼來使用這個模板頁呢?其實很簡單,只需要在要使用模板頁的View中修改Layout屬性即可:

2.2 View未動,ViewStart先行

在Razor檢視引擎中,所有頁面啟動之前,ViewStart檔案會先執行。那麼,這個ViewStart檔案到底做了些什麼事兒呢?

(1)可以看出,這個ViewStart是一個全域性的頁面。當我們的頁面未指定Layout的時候,如果專案在全域性或在同資料夾記憶體在_ViewStart.cshtml時該頁面的Layout會自動繼承自_ViewStart.cshtml,如果不同的資料夾層級都存在_ViewStart.cshtml,則繼承離該頁面最近的一個。

(2)如果我們想要所有的頁面都預設使用一個指定模板頁,只需將這個Layout改為新模板頁即可。例如:將Layout改為我們剛剛建立的~/Views/Shared/_MyLayout.cshtml。

2.3 RenderBody與RenderSection

(1)RenderBody:

@RenderBody()在模板頁中使用表示內容頁在模板中的位置。當建立具有模板頁的內容頁的時候,內容頁就呈現在模板頁中@RenderBody()所在的位置,一個模板頁中只能有一個@RenderBody()。

(2)RenderSection:

@RenderSection用於在模板佈局中定義一個區域,在內容頁可以定義一些內容來填充這個區域,例如內容頁中引用的JS檔案,可以填充到模板頁的section位置。每個內容頁的單獨一些資訊,可以在模板頁中這個區域顯示。

@RenderSection有兩個個引數,第一個引數用於定義section的名稱,第2個引數是布林型別,如果為TRUE,表示內容頁必須定義這個section,如果為false,則表示內容頁可定義section,也可以不定義。

三、WebAPI初步—構建輕量級Restful服務的利器

 3.1 Restful架構是什麼?

RESTful架構,就是目前最流行的一種網際網路軟體架構。它結構清晰、符合標準、易於理解、擴充套件方便,所以正得到越來越多網站的採用。

這裡借用阮一峰博士的總結,到底什麼是Restful架構:

(1)每一個URI代表一種資源

(2)客戶端和伺服器之間,傳遞這種資源的某種表現層;

(3)客戶端通過四個HTTP動詞,對伺服器端資源進行操作,實現”表現層狀態轉化“。

各位園友可以閱讀阮一峰博士的這篇《理解RESTful架構》的文章來了解Restful架構的基本概念。

綜上所示,REST是一種簡潔的設計風格,通過URL來設計系統,以URI來抽象各種資源,以HTTP協議的PUT、DELETE、GET、POST來對應對資源的各種操作。

3.2 WCF and WebAPI

首先,ASP.NET Web API 和WCF有著千絲萬縷的聯絡。

WCF是一個通用的服務架構平臺,其設計之初在於建立一個通用的Web Service平臺,可以在各種不同的協議(TCP, UDP, HTTP)下使用,僅僅通過EndPoint的配置而不需要修改程式碼實現就能適應不同的工作環境。WCF也是微軟以前很多服務產品的合體。

WCF 裡面可以採用模板的方式來實現REST架構風格,但WCF畢竟是一個集大成的平臺(或者說是:比較重量級)。WCF的野心造成了它的龐大複雜,HTTP的單純造就了它的簡單優美。於是經常自問:拿著牛刀削蘋果有必要嗎?廢話,當然沒有必要,水果刀在哪裡?因此,我們所需要的僅僅是裡面HTTP REST風格的部分。各種因素糾結下,微軟於是便把WCF裡面的這部分團隊抽離出來合併到了MVC組中,才有了現在的ASP.NET Web API,幷包含在MVC 4中釋出。

3.3 第一個WebAPI專案

(1)新建一個ASP.NET MVC專案,取名為:MyMvcWebAPIDemo,專案型別選擇WebAPI。

(2)在Models中新增一個類,取名為:Product,作為我們要測試的實體模型。

(3)在Controllers中新增一個控制器,並選擇“空WebAPI”型別模板,取名為:ProductController。

(4)為了方便進行資料測試,這裡定義一個靜態的產品集合。當然,在實際應用中,我們可能會從資料庫中讀取資料集合,並對其進行增刪查改及各種查詢操作。

(5)定義一些方法,用於對產品集合的各種操作:

一般來說,Http的四種訪問型別中,Get:一般用作查詢,多次操作得到結果一致;Post:一般用於修改、新增多次重複操作得到結果不一致。Put:一般用於修改,多次操作得到結果一致。Delete:一般用於刪除資料,多次操作得到結果一致。

現在,我們來看一下我們寫的這些方法:

①用於GET方式獲取的方法有:

GetAllProducts用於獲取所有產品的集合;GetProductById用於返回指定Id的產品物件;

GetProductByName使用者返回指定Name的產品物件;GetAllProductsByCategory則使用者返回指定Category(種類)的產品集合;

②用於POST方式的方法有:

PostProduct用於增加一個產品資訊;

③用於PUT方式的方法有:

PutProduct用於修改一個指定的產品資訊;

④用於DELETE方式的方法有:

DeleteProduct用於刪除一個選擇的產品資訊;

以上GET、POST、PUT、DELETE則構成了我們通過HTTP協議對資源的各種操作了。具體的程式碼,這裡我就不過多贅述,相信大家都能看懂。

(6)此時,我們有了一個能工作的Web API了。該控制器上的每個方法都對映到一個URI,例如下表中所示的前三個方法所對應的URI:

Controller Method
控制器方法
URI
GetAllProducts /api/product
GetProductById /api/product/id
GetProductsByCategory /api/product/?category=category

客戶端可以通過URI來訪問我們的控制器已達到對資源的操作,那麼,我們可以設計一個頁面來傳送AJAX請求來實踐一下。

(7)在Views中的預設Home/Index這個頁面中,加入以下程式碼:

通過除錯執行,可以看到以下頁面效果,並可以看到,由於我們在頁面中加入了獲取產品列表的GET請求,於是產品資訊被載入到了頁面中:

其對應的JS語句為:可以看到,我們通過api/Product呼叫了API控制器中的GetAllProducts方法,獲取了所有產品資訊。

(8)下面我們可以來試試其他的API方法:

3.4 第一個RestClient客戶端專案

有了我們上面的WebAPI專案的支援,我們可以在客戶端(如:WindowsForm專案、Windows Phone專案等等)對WebAPI專案中的資源進行訪問和操作,現在我們就來實現一個RestClient控制檯專案模擬一個客戶端對WebAPI發起HTTP訪問請求。

(1)新建一個控制檯專案,取名為:MyConsoleRestClientDemo。

(2)新建一個類,取名為:RestClient.cs。它封裝了我們常用的HTTP操作,如GET、POST、PUT、DELETE方式。

(3)在Program.cs中的Main方法中,呼叫RestClient類為我們提供的方法對WebAPI伺服器(這裡是本機:http://localhost:8080/)發起訪問:

(4)除錯執行,檢視訪問結果如下:可以看出,返回的均為JSON格式的資料,和我們在瀏覽器中訪問指定URI的結果一致。

3.5 初探小結

ASP.NET Web API 是一種框架,用於輕鬆構建可以訪問多種客戶端(包括瀏覽器和移動裝置)的 HTTP 服務。 ASP.NET Web API 是一種用於在 .NET Framework 上構建 RESTful 應用程式的理想平臺。

參考文章

(1)搏擊的小船,《ASP.NET MVC2 Areas區域新概念》,http://www.cnblogs.com/guanjie20/archive/2010/09/09/1822175.html

(2)遊響雲停,《ASP.NET MVC3細嚼慢嚥-(2)模板頁 》,http://blog.csdn.net/zx13525079024/article/details/8301943

(3)李林峰,《無廢話MVC入門教程四[檢視中的Layout使用]》,http://www.cnblogs.com/iamlilinfeng/archive/2013/02/28/2934397.html

(4)阮一峰,《理解Restful架構》,http://www.ruanyifeng.com/blog/2011/09/restful.html

(5)便當之神,《ASP.Net WebAPI》,http://www.cnblogs.com/bnbqian/archive/2012/06/28/2565417.html

(6)dudu,《HttpClient + ASP.NET Web API, WCF之外的另一個選擇》,http://www.cnblogs.com/dudu/archive/2012/05/11/asp_net_webapi_httpclient.html

附件下載

(1)MyWebAPIDemo:http://pan.baidu.com/s/1hqzgwb6

相關文章