內容簡介
《asp net mvc 2開發實戰》以循序漸進的方式揭開asp net mvc的神秘面紗,幫助開發人員將現有的asp net web forms項目轉移到asp net mvc架構,引導讀者建立正確的開發觀念,並搭配visual studio 2010開發工具,帶領讀者體驗asp net mvc的強大魅力。
《asp net mvc 2開發實戰》主要分成3篇。基礎觀念篇介紹了開發人員在學習asp net mvc之前需要了解的技術和觀念,以及mvc架構的基礎知識。技術講解篇針對asp net mvc 2的各項開發技術進行解析,以幫助開發人員解決實際問題。開發實踐篇通過一套完整的留言板系統案例詳述asp net mvc 2的開發技巧與流程,以及asp net mvc的安裝部署和單元測試方法。
《asp net mvc 2開發實戰》適合對mvc架構感興趣的asp net開發人員閱讀。
作譯者
黃保翕(Will保哥)微軟最有價值專家(MVP);擅長各種Web解決方案、大中型網站架構、資料庫系統、網站內容管理系統的設計;也是網路知名的技術專家,部落格“The Will Will Web”目前已經累積近千篇文章,提供Web相關技術的實用解決方案。
目錄
《asp net mvc 2開發實戰》
第1篇 基礎觀念篇
第1章 在學習asp net mvc之前 2
1 1 何謂mvc 3
1 1 1 何謂model 3
1 1 2 何謂view 4
1 1 3 何謂controller 5
1 2 mvc架構初探 6
1 2 1 關聯性 6
1 2 2 獨立性 7
1 3 為什麼要使用asp net mvc 8
1 3 1 分解關注點與可維護性 8
1 3 2 開放性與社區支持 9
1 3 3 開發工具與開發效率 10
1 3 4 易於測試的架構 10
1 3 5 易於分工的架構 11
總結 11
第2章 建立正確的開發觀念 12
2 1 分解關注點 13
2 2 以習慣取代配置 13
2 3 對開發asp net mvc項目的建議 14
2 4 asp net mvc中常見的問題 18
總結 25
第3章 新手上路初體驗 26
3 1 認識visual studio 2010 27
3 1 1 解決方案資源管理器視窗 27
3 1 2 伺服器資源管理器視窗 27
3 1 3 工具箱視窗 27
3 1 4 輸出視窗 28
3 1 5 錯誤列表視窗 28
3 1 6 擴充管理器 29
3 1 7 代碼段管理器 29
3 2 創建第1個asp net mvc項目 30
3 2 1 用asp net mvc 2項目模板創建項目 30
3 2 2 創建數據模型 38
3 2 3 創建控制器和動作 41
3 2 4 創建視圖 42
3 2 5 在視圖中創建視窗 44
3 2 6 通過action接收視窗數據 46
3 2 7 實現留言顯示功能 49
3 3 學習mvc時的注意事項 53
3 3 1 了解不同的項目類型 53
3 3 2 初學者常犯的錯誤 53
3 3 3 小心使用request對象和response對象 54
3 3 4 不要在視圖中編寫過多的程式邏輯 54
3 4 改良asp net mvc項目 55
3 4 1 使用視圖數據模型 55
3 4 2 使用視窗驗證功能 58
3 4 3 避免用戶重複傳送信息 65
總結 68
第2篇 技術講解篇
第4章 網址路由與asp net mvc的生命周期 70
4 1 網址路由 71
4 1 1 比對通過瀏覽器傳來的http請求 71
4 1 2 將適當的網址返回瀏覽器 71
4 1 3 默認網址路由 71
4 2 http請求的url如何對應網址路由 73
4 2 1 網址路由範例 73
4 2 2 為網址路由加上限制條件 75
4 3 網址路由如何在asp net mvc中生成網址 76
4 4 asp net mvc的執行生命周期 81
4 4 1 網址路由比對 81
4 4 2 執行controller和action 83
4 4 3 執行view並返回結果 86
總結 87
第5章 用model創建數據模型 88
5 1 model的任務 89
5 2 創建基礎數據模型 89
5 2 1 用linq to sql自動創建數據模型 90
5 2 2 用entity framework自動創建數據模型 93
5 2 3 手動創建數據模型 98
5 3 擴充基礎數據模型 99
5 3 1 定義model的metadata 100
5 3 2 自定義metadata驗證屬性 104
5 4 實現庫模式 104
總結 106
第6章 剖析controller的相關技術 107
6 1 controller的責任 108
6 2 controller的類與方法 108
6 3 controller的執行過程 109
6 4 動作名稱選取器 111
6 5 動作方法選取器 112
6 5 1 nonaction屬性 113
6 5 2 httpget屬性、httppost屬性、httpdelete屬性和httpput屬性 113
6 6 actionresult類 114
6 6 1 viewresult類 115
6 6 2 partialviewresult類 117
6 6 3 emptyresult類 117
6 6 4 contentresult類 118
6 6 5 fileresult類 119
6 6 6 強制下載檔案時需注意中文檔案名稱的問題 122
6 6 7 javascriptresult類 124
6 6 8 jsonresult類 124
6 6 9 redirectresult類 126
6 6 10 redirecttoroute類 126
6 7 viewdata與tempdata概述 128
6 7 1 viewdata 128
6 7 2 tempdata 129
6 8 模型綁定 131
6 8 1 簡單模型綁定 131
6 8 2 使用formcollection類獲取視窗數據 132
6 8 3 複雜模型綁定 132
6 8 4 多個複雜模型的綁定 134
6 8 5 判斷模型綁定的結果 136
6 8 6 使用bind屬性限制可被更新的model屬性 138
6 9 動作過濾器 141
6 9 1 授權過濾器屬性 142
6 9 2 動作過濾器屬性 145
6 9 3 結果過濾器屬性 147
6 9 4 異常過濾器屬性 149
6 9 5 自定義動作過濾器屬性 150
總結 152
第7章 view的相關技術 153
7 1 view的責任 154
7 2 不要用asp的觀念來編寫asp net mvc程式 154
7 3 view如何從action中獲取數據 154
7 3 1 如何正確分配view 155
7 3 2 使用弱類型模型獲取數據 156
7 3 3 使用強類型模型獲取數據 157
7 4 html輔助方法 158
7 4 1 如何使用html輔助方法 158
7 4 2 html輔助方法的套用實例 160
7 4 3 強類型輔助方法 165
7 4 4 dynamic data對asp net mvc的支持 166
7 4 5 url輔助方法 167
7 4 6 ajax輔助方法 169
7 4 7 自定義html輔助方法 170
7 4 8 tagbuilder類詳解 173
7 5 masterpage模板 176
7 6 部分視圖 178
7 6 1 什麼是部分視圖 178
7 6 2 如何創建一個部分視圖 179
7 6 3 如何調用部分視圖 180
7 6 4 部分視圖的高級套用 181
7 6 5 用renderaction() 方法載入部分視圖 184
總結 185
第8章 area的相關技術 186
8 1 何時需要使用area切割網站 187
8 2 如何在現有項目中新建area 188
8 3 如何設定area的網址路由 189
8 4 默認路由與area路由的優先權 190
8 5 就算使用area,controller的名稱還是有衝突的 190
8 6 如何指定默認網站與area網站的連線 191
總結 192
第3篇 開發實踐篇
第9章 mvcguestbook高級實戰 194
9 1 分析需求與創建網站雛形 195
9 1 1 規劃資料庫結構 195
9 1 2 創建基礎數據模型 196
9 1 3 規劃網站功能 196
9 1 4 設計controller與action 197
9 1 5 創建基礎頁面 200
9 2 實現會員機制 201
9 2 1 會員註冊機制 201
9 2 2 會員登錄/註銷功能 212
9 3 實現留言機制 219
9 3 1 編寫留言列表 219
9 3 2 新建留言列表頁面 221
9 3 3 為留言列表添加分頁功能 222
9 3 4 編寫會員留言功能 225
9 3 5 編寫會員留言視圖 228
9 3 6 編寫版主回復功能 228
9 3 7 創建版主回復視圖 230
9 3 8 編寫刪除留言功能 231
9 4 實現動作記錄機制 232
9 4 1 編寫actionlogattribute動作過濾器屬性 232
9 4 2 將屬性套用到action 233
9 5 強化model的結構 233
9 6 使用控制反轉容器 248
9 6 1 asp net mvc與autofac的集成 250
9 6 2 asp net mvc與autofac集成的原理 252
9 6 3 讓autofac自動解析接口和對應的類 252
9 6 4 修正controller的構造符 255
總結 256
第10章 asp net mvc開發技巧 257
10 1 asp net mvc的多語系支持 258
10 2 在http回響標題中隱藏asp net mvc的版本 261
10 3 一起編譯visual studio和view 262
10 4 mvchtmlstring類的開發技巧 265
10 5 在mvc與web forms之間傳遞數據 267
10 5 1 http get方法(querystring集合)和http post方法 267
10 5 2 session 267
10 6 如何調試asp net mvc原始碼 268
10 6 1 使用 net framework原始碼逐步調試功能 268
10 6 2 下載asp net mvc原始碼並添加項目參考 273
10 7 使用visual studio程式模板進行快速開發 279
10 7 1 如何使用程式模板快速生成view 279
10 7 2 如何將內置的程式模板添加到項目中 280
10 7 3 如何修改內置的addcontroller程式模板並自動生成程式代碼 283
10 7 4 如何新建自定義的addview程式模板並自動生成程式代碼 284
10 7 5 深入t4程式生成器 287
總結 287
第11章 安裝部署 288
11 1 如何將網站部署到本地iis中 289
11 2 如何部署遠程iis 294
11 3 如何用命令提示符手動部署 296
11 4 部署asp net mvc時常見的問題 299
11 4 1 無法載入檔案或組件 299
11 4 2 部署到iis 6之後看不到網頁 300
11 4 3 部署到iis 6或iis 7之後都無法使用網站 302
11 5 部署asp net 4 0時的注意事項 304
11 5 1 安裝時的注意事項 304
11 5 2 安裝正確的 net framework包 304
11 5 3 應用程式集區不能跨 net版本設定 305
總結 305
第12章 單元測試 306
12 1 關於軟體測試 307
12 1 1 何謂單元測試 307
12 1 2 何謂集成測試 308
12 1 3 如何區別單元測試與集成測試 309
12 1 4 何謂測試驅動開發 309
12 2 創建asp net mvc的單元測試項目 311
12 2 1 單元測試項目的命名規則 311
12 2 2 新建項目時自動創建單元測試項目 311
12 2 3 通過單元測試嚮導創建單元測試項目 313
12 2 4 在controller類中創建單元測試項目 315
12 3 如何編寫asp net mvc單元測試 315
12 3 1 單元測試的3a模板 316
12 3 2 編寫controller單元測試 316
12 3 3 在visual studio中執行單元測試程式 319
12 3 4 查看程式代碼涵蓋範圍 320
12 3 5 編寫適合進行單元測試的程式代碼 323
12 3 6 使用stub假對象完成單元測試 325
12 3 7 使用mock假對象完成單元測試 327
12 3 8 編寫routing單元測試 330
總結 332
前言
在開始學習ASP NET MVC之前,我想許多讀者心中應該都有疑惑,尤其是正宗的ASP NET Web Forms開發者,更可能會對ASP NET MVC技術給予異樣的眼光甚至誤解。
《ASP NET MVC 2開發實戰》分為3篇,以循序漸進的方式揭開ASP NET MVC的神秘面紗,引導讀者建立正確的觀念,實際體驗ASP NET MVC的強大魅力。
建議閱讀順序:
第1篇→第2篇→第3篇:想按部就班學習ASP NET MVC的人。
第1篇→第3篇→第2篇:想先感覺程式,再建立觀念的人。
第3篇→第1篇→第2篇:懶得閱讀文字,只想看程式代碼的人。
第1篇 基礎觀念篇
第1章 在學習ASP NET MVC之前
本章將介紹ASP NET MVC的基礎知識,幫助你了解ASP NET MVC的概況。由於本章內容著重於觀念的講解,如果覺得看不懂,可先跳過,待將讀完後續的章節之後再回頭閱讀,或許更能幫助你建立正確的觀念。
第2章 建立正確的開發觀念
本章主要說明使用ASP NET MVC進行網站開發時應有的正確觀念。強大的工具若沒有正確的觀念支持,就像是給你一台馬力強又省油的手動擋汽車,而你卻不知道離合器應該如何使用一樣——也許當你嘗試了一段時間,覺得車子還是開不快時,就會提前放棄一部好車。本章的最後也整理了一些初學者在學習ASP NET MVC時經常會問的問題,並逐一進行回答。
第3章 新手上路初體驗
本章介紹如何利用Visual Studio 2010創建一個ASP NET MVC項目,讓讀者親身體驗ASP NET MVC實際開發的完整過程。相信在逐步教學的帶領之下,能讓現有的ASP NET Web Forms開發人員了解其與ASP NET MVC開發的差異,進而快速上手。
第2篇 技術講解篇
第4章 網址路由與ASP NET MVC生命周期
想要掌握ASP NET MVC,最重要的是要了解網址路由(Routing)與ASP NET MVC生命周期的重要概念。網址路由在ASP NET MVC中有兩個用途:一個用途是比對通過瀏覽器傳來的HTTP請求,並將其對應到適當的控制器(Controller)與動作(Action)中進行處理;另一個用途是決定ASP NET MVC應該輸出什麼樣的網址來回響瀏覽器。雖然跳過本章你仍然可以成功地創建ASP NET MVC網站,但閱讀本章能幫助你理解ASP NET MVC執行時的順序,進而減少犯錯的機會。
第5章 用Model創建數據模型
在用ASP NET MVC開發網站的過程中,通常模型(Model)是整個項目中首先要開發的部分,所有需要進行數據訪問的地方都仰賴模型提供服務。本章將講解如何通過Visual Studio 2010自動建立數據模型以及手動建立和查看數據模型,並通過部分類的輔助方法實現基本的欄位驗證,甚至完成商業邏輯驗證,最後通過實現庫模式(Repository Pattern),讓ASP NET MVC項目更易於進行單元測試與測試驅動開發(Test-Driven Development,TDD)。
第6章 剖析Controller的相關技術
ASP NET MVC的核心就是Controller,它負責處理瀏覽器傳來的所有請求並決定回響的內容。但Controller並不負責決定如何顯示內容,而是僅將特定類的內容回響給ASP NET MVC框架。視圖(View)才是決定回響內容的重要角色。本章也會套用第2章提及的“分解關注點”、“以習慣取代配置”、“不要重複你自己”等觀念,帶你邁入ASP NET MVC的殿堂,發現ASP NET MVC的核心之美。
序言
筆者目前任職於多奇數位創意有限公司,擔任技術總監一職,負責公司技術方向的決策。大約在兩年多前,我開始注意到,ASP NET MVC技術在國外漸漸發展起來。起初,我並不覺得它有什麼特別的地方,但慢慢看到一些國外對ASP NET MVC的開發觀念與設計方法的討論——好像它真的能夠解決當時ASP NET Web Forms開發上的難點,例如內置的控制項不好用、控制項套版不易、抽象的ASP NET Web Forms事件模型經常讓新手搞不清楚狀況、過大的ViewState等,而這些都是我們在日常開發工作中會遇到的問題。
直到2009年初,ASP NET MVC 1 0正式版上市,除了還在創建與維護中的ASP NET Web Forms項目不會改動之外,我毅然決然地帶領公司的所有開發人員投入ASP NET MVC的懷抱,並宣布未來所有新項目皆以ASP NET MVC技術為主。這是一個重大的決定,也是一個我至今未曾後悔的決定。對我來說,學習一門全新技術的動機很重要。當你因為接觸一門新技術而必須要放棄許多以往的開發經驗時,如果沒有明確的動機並發現轉變的價值,是很難下定決心的。因此,要進入一個全新的技術領域,首先要感受技術的價值,然後是進一步研究技術的細節。
本書的寫作歷時一年多的時間,在這段時間裡,ASP NET MVC的版本也從ASP NET MVC 1 0升級到了ASP NET MVC 2 0。由於ASP NET MVC的觀念與架構十分優秀、嚴謹,因此,技術升級的過程非常順利,而且開發觀念也不需要重新建立。對開發人員來說,即使升級至ASP NET MVC 2 0,在學習上也沒什麼負擔。即便是未來的ASP NET MVC 3 0,微軟的ASP NET MVC開發團隊也能保證它會與ASP NET MVC 1 0兼容,早期編寫的程式完全可以順利轉移。新版本的ASP NET MVC只會繼續在同一套架構上增強功能,並強化對Visual Studio 2010的支持。因此,筆者認為,ASP NET MVC在未來非常具有可發展性。
筆者曾經想過,我們公司會不會是台灣地區唯一一個只使用ASP NET MVC技術開發網站項目的公司呢?不過,這並不是重點,重點是我們現在創建的網站不但更加安全、開發速度更快、項目生成和完成的時間更短,最重要的是,網站變得易於維護,質量也更高了,這都要歸功於ASP NET MVC的技術架構。因為ASP NET MVC非常強調“分解關注點”的觀念,而且從開發架構上來看,也很容易讓開發人員做到“分解關注點”,這個優勢是ASP NET Web Forms完全無法匹敵的。
本書集結了筆者在學習與開發ASP NET MVC時的經驗與心得,希望能帶給所有 NET開發人員一個全新且優秀的選擇。讓我們一起擁抱ASP NET MVC的世界吧!
能夠順利出版這本書,我要感謝很多人。首先,最感謝的是我的ASP NET MVC開發團隊,在公司里,他們寫的Code比我寫的字還多出很多很多,本書涉及的很多開發技巧與學習心得都來自於他們。除此之外,Demo、Thomsen、Danny、Bibby協助我撰寫了部分章節,星寂、Jerry幫我完成了許多範例程式。我還要感謝幫我校稿與驗證範例程式的朋友們,如果沒有他們的協助,這本書恐怕很難完成。
同時,也非常感謝悅知文化的編輯Vicky,在我寫作的過程中提供了許多的協助並給予我包容,因為我從來就沒有按照“寫作說明”寫作文章,即便要出書,也還是覺得寫部落格的心情與角度比較符合我的風格。
這是我寫的第一本書,如果讀者對書中的內容或觀念有任何不理解的地方,歡迎到我的部落格、Facebook冬粉專頁或噗浪(Plurk)上與我交流、互動。
黃保翕(Will保哥)