用Visual Studio創建了一個新的ASP.NET MVC應用程序后,將自動向這個項目中添加一些文件和目錄。
如圖所示:
用Internet Application模板創建ASP.NET MVC項目后有8個頂級目錄。
如圖所示:
如果不喜歡這個目錄結構,怎么辦?
ASP.NET MVC並不是非要這個結構。
事實上,那些處理大型引用程序的開發人員通常跨多個項目來今個應用程序,以便使該應用程序更易於管理。
(例如,數據模型的實體類常常位於一個來自單獨的類庫項目中)。
然而,默認的項目結構確實提供了一個很好的默認目錄約定,使得系統的關注點變得明確、清晰。
當進行擴展時,請注意關於這些文件或文件夾的以下內容:
1. /Controllers目錄
展開這個文件夾,將會發現Visual Studio默認向里面添加了默認的Controller類。
如圖所示:
2. /Views目錄
展開這個文件夾,將會發現3個子目錄(/Home、/Account和/Shared)以及其中的一個模板文件。
這些子目錄也是默認添加到當前項目中的,如圖所示:
3. /Content和/Scripts目錄
展開這個目錄,將會發現幾個CSS文件(用於調整站點上所有HTML文件的樣式)以及Javascript庫(可以啟用應用程序中的jQuery支持)。
如圖所示:
4. /BookStore.Test項目
展開這個項目,將會發現一個類,其中包含所有對應於HomeController類的單元測試。
如圖所示:
這些由Visual Studio天際的默認文件提供了一個可以運行的應用程序的基本結構。
完整地包括了首頁、關於頁面、賬戶登錄/退出/注冊頁面以及一個未經處理的錯誤頁面(所有頁面彼此聯系起來,可以直接使用)。
一、SP.NET MVC的約定
默認情況下,ASP.NET MVC應用程序對約定的依賴性很強。
這樣就避免了開發人員配置和指定一些項,因為這些項可以根據約定來推斷。
例如,當解析視圖模板時,ASP.NET MVC采用一種基於約定的目錄命名結構。
這個約定可以實現當從Controller類中引用視圖引擎時,省略位置路徑信息。
默認情況下,ASP.NET MVC會從應用程序下的\Views\[ControllerName]\目錄中查找視圖模板文件。
設計ASP.NET MVC是圍繞着一些基於約定的默認項,這些默認項在需要的時候可以被覆蓋。這個概念通常稱為“約定優於配置”。
二、約定優於配置
在Ruby on Rails上約定優於配置的概念流行開來,它的本質意義在於:到目前為止,您已經知道如何創建Web應用程序,現在將以以前積累的經驗應用於框架中,以后開發就沒必要再配置每一項。
通過查看應用程序運行的三個核心目錄,可以在ASP.NET MVC中看到這一概念:
1. Controllers
2. Models
3. Views
沒必要在web.config文件中設置這些文件夾名稱 —— 他們約定在配置文件中。
這樣就避免了編輯XML文件(如web.config)的工作。
例如,為了顯示地告訴MVC引擎“可以在Views目錄中查找程序視圖” —— 這些程序都已經知道,這就是約定。
這不是魔術,但實際上又是,但是它又不是那種黑魔術(結果出人意料的,甚至傷害到自己的魔術)。
ASP.NET MVC的約定非常容易理解,下面是預期的程序結構:
1. 每個Controller類的名字以Controller結尾,例如ProductController、HomeController等,這些類在/Controllers目錄中。
2. 應用程序的所有視圖放在一個單獨的Views目錄下。
3. 控制器使用的視圖是在Views主目錄的一個子目錄中,這個子目錄是根據控制器名稱(后面減去Controller的后綴)來命名的。
例如“HomeController”使用的視圖就放在“/Views/Home”中。
所有可重用的UI元素都位於一個相似的結構中,而不是全部都直接存在Views文件夾里面。
相關的內容會在后面操作視圖的時候回着重介紹。
三、定簡化通信
編寫代碼進行通信主要面向兩個不同的方面:
1. 需要將清晰的無二義性的指令傳遞給計算機,讓它去執行。
2. 需要讓開發人員讀懂你的代碼,以便后期系統的維護、調試以及完善。
前面已經討論了約定優於配置如何高效地將開發者的想法意圖傳達給MVC。
約定也能幫助開發者清晰地和其他開發人員(或者以后的自己)進行交流。
不必詳細地描述如何構建應用程序的每一個方方面面,按照共同的約定可以是世界上所有的ASP.NET MVC開發人員公用一個公共的標准。
通常,軟件設計模式的優勢之一是他們建立了一種標准語言。
由於ASP.NET MVC采用了MVC模式以及一些獨特的定義,這讓ASP.NET MVC開發者能夠輕松地理解不是自己編寫的代碼或以前編寫但是現在忘記了的代碼,即便在大型的系統中也是這樣。
想象一下,國家不同,語言不通,膚色不同,但是寫的代碼都是按照默認約定走的,你是不是也能看懂了?哈哈。