《ASP.NET MVC 4 開髮指南》 [作者] (台) 黃保翕[出版] 清華大學出版社[版次] 2013年07月 第1版[印次] 2013年07月 第1次 印刷[定價] 59.00元 【作者序】 要進入一個全新技術的領域,首要任務就是先感受技術的價值,然後再進一步深入研究技術的細節。 【第01章 ...
《ASP.NET MVC 4 開髮指南》
========== ========== ==========
[作者] (台) 黃保翕
[出版] 清華大學出版社
[版次] 2013年07月 第1版
[印次] 2013年07月 第1次 印刷
[定價] 59.00元
========== ========== ==========
【作者序】
要進入一個全新技術的領域,首要任務就是先感受技術的價值,然後再進一步深入研究技術的細節。
【第01章】
(P004)
簡言之,只要是和 “數據” 有關的任務,都應該在 Model 里完成定義。
(P006)
簡言之,所有應該要顯示在網頁上的邏輯都是 View 負責的範圍。
(P013)
通過自定義的 T4 代碼生成器模板,也能快速地自動生成代碼,進而達到快速開發之目的。
(P014)
鼓勵開發人員能多接觸各種不同的技術領域,甚至學習不只一種程式語言,除了能開闊視野外,也能夠激發不少開發上的創意與樂趣。
【第02章】
(P017)
ASP.NET MVC 就是一個合理使用以習慣替換配置的開發框架,它將通過 MVC 設計模式常見的規則,切割成 Model 、 View 、 Controller 三個部分,而且明確定義開發人員必須按照特定的 “習慣” 來開發程式。
【第03章】
(P053)
在定義 Routing 的時候,可能會註意到有個大括弧 { } 包裹著一個變數名稱,這個變數名稱就是路由參數,這裡的路由參數是可以自定義的,不過在所有路由參數中最重要的就是 {controller} 與 {action} 這兩個。 ASP.NET MVC 為了能夠對應到正確的 Controller 與 Action ,所以這兩個路由參數是必選參數,如果網址路徑沒有包含這兩個參數的話,在 defaults 參數里必須要指定才行。
(P055)
動態 (dynamic) 型別出現在 C# 4.0 之中,因此 ASP.NET MVC 4.0 網址必須運行在 .NET Framework 4.0 以上版本才行。
(P069)
如果在 View 裡面定義了 @model 模型聲明,通過 Controller 傳到 View 的模型數據也必須與這個 View 聲明的型別相容,否則將會引發例外。
(P073)
使用 Razor 語法輸出屬性,預設所有數據都會使用 HTML 編碼 (HtmlEncode) 輸出,這是出自於程式安全考慮,避免網頁遭受跨網站腳本攻擊 (Cross-Site Scripting Attach) 。
(P093)
使用 ASP.NET MVC 標準的數據模型綁定 (Model Binder) 才是王道。
【第04章】
(P102)
IgnoreRoute 與 MapRoute 擴充方法是 ASP.NET MVC (System.Web.Mvc) 的一部分。
(P105)
所有網址都是從 http://localhost/ 之後開始比對,我們稱為 “網址路徑” 。
(P106)
在 “URL 樣式” 的地方出現的所有路由參數,都是 “必要的” 參數,必須完全符合才算是比對成功,比對失敗就會跳至下一條網址路由規則繼續比對,但如果所有路由規則都比對失敗的話,那麼,這次的 HTTP 請求就會交由 IIS 的其他 HTTP 模塊負責處理。
【第05章】
(P137)
任何 Entity Framework 里的模型,都被要求一定有主鍵。
(P141)
可以設置 StringLength 屬性來限定欄位長度。
(P143)
在使用 Entity Framework 的時候無法指定資料庫中的預設值,若要加上預設值,則必須在資料庫中手動設置。
(P154)
使用 Code First 開發時要特別註意,若要在 Code First 模型類別中啟用 “延遲裝入” 特性,必須在屬性聲明加上 virtual 關鍵字,才會啟用 “延遲裝入” 特性。
(P159)
若要在項目中啟用資料庫遷移功能,必須先開啟程式包管理控制台 (Package Manager Console) 窗格,然後輸入 Enable-Migrations 指令。
(P180)
只有通過適當的 Model 規劃,才有助於開發出一個容易維護,且關註點分離的 ASP.NET MVC 專案。
【第06章】
(P182)
所有動作方法必須為公開方法。任何非公開的方法如聲明為 private 或 protected 的方法都不會被視為一個動作方法。
(P183)
Action 若要聲明成 void 也是可以的,那就代表這個 Action 不會回傳任何數據到客戶端。
如果 ActionInvoker 找不到對應的 Action ,預設會運行 System.Web.Mvc.Controller 類別的 HandleUnknownAction 方法,在 System.Web.Mvc.Controller 類別里 HandleUnknownAction 方法預設會相應 HTTP 404 找不到資源的錯誤消息。
(P186)
若套用 NonAction 屬性在 Controller 里的 Action 方法上,即便該 Action 方法是 “公開方法” ,也會告知 ActionInvoker 不要選定這個 Action 來運行。
(P188)
ActionResult 是 Action 運行後的回傳型別,但是當 Action 回傳 ActionResult 的時候,其實並不包含這個 ActionResult 的運行結果,而是包含運行這個 ActionResult 時所需的數據,當 MvcHandler 從 Controller 取得 ActionResult 之後才會去運行出 ActionResult 的結果。
(P199)
JavaScriptResult 的功能與 ContentResult 差不多,主要的差別在於預設的 Content-Type 不一樣而已, JavaScriptResult 預設的 Content-Type 為 application/x-javascript 。
JSON (JavaScript Object Notation) 是 Web 在實作 Ajax 應用程式時經常使用的一種傳輸數據格式, JsonResult 可自動將任意對象數據串列化成 JSON 格式回傳, JsonResult 預設的 Content-Type 為 application/json ,對某些 JavaScript Framework 這是必要需求。
JsonResult 是使用 JavaScriptSerializer 完成 JSON 串列化操作,但如果你的對象無法串列化,這個轉換的過程將會發生例外。
(P201)
在 RedirectResult 的內部,基本上還是以 Response.Redirect 方法響應 HTTP 302 暫時導向。
在 ASP.NET MVC 3 的版本之後, System.Web.Mvc.Cntroller 類別里還內建了一個 RedirectPermanent 輔助方法,可以讓 Action 響應 HTTP 301 永久導向。使用 HTTP 301 永久導向可以提升 SEO 效果,可保留原本頁面網址的網頁排名 (Ranking) 記錄,並自動遷移到轉向的下一頁,這對於網站改版導致網站部分頁面的網址發生變更時非常實用。
(P209)
ViewData 屬性被聲明為一個 dynamic 動態型別,並且屬性是一個傳入 ViewData 的 DynamicViewDataDictionary 動態 ViewData 字典,嚴格上來說,ViewBag 並沒有什麼的特殊之處,因為所有對 ViewBag 屬性的任何訪問動作,最終都還是對 ViewData 來進行操作,唯一的差別僅在於 ViewBag 是 dynamic 動態型別而已,優點是可以少輸入幾個字元。
(P210)
dynamic 型別是 .NET Framework 4.0 的新功能。
(P212)
從 ASP.NET MVC 2.0 之後的版本,只有在使用 RedirectResult 或 RedirectToRouteResult 當成 ActionResult 型別時,才會強制保留 TempData 不被清除,除此之外,只要有取用 TempData 的鍵值,預設就會在當次網頁要求就被清除。但是,如果你只單純設置了 TempData 的值,並沒有讀取行為的話, TempData 還是會被保留到下一次取用。
在大部分的情況下, DefaultModelBinder 類別就可以處理掉 95% 以上的信息型態,除非你有特殊的用途。
(P214)
除了通過簡單模型綁定取得窗體傳來的單欄信息外,還可以通過 FormCollection 一次取得整份窗體傳來的信息。
(P222)
通過 ASP.NET MVC 自動模型綁定請務必在動作 (Action) 里驗證 ModelState.IsValid 屬性,否則那些驗證失敗的數據模型可能還會被你新增到資料庫中。
(P227)
在 UpdateModel 的前一行必須先準備好一個數據模型對象,才能讓 UpdateModel 自動綁定數據上去。
(P228)
在運行 TryUpdateModel 之前, ModelState 不會有任何信息、當運行完 TryUpdateModel 之後,就可以通過 ModelState 取得模型綁定過程中完整的驗證錯誤信息。
(P230)
動作過濾器屬性可以套用在 Action 之上,也可以套用在 Controller 類別上,若動作過濾器屬性套用在 Controller 類別上等於套用此屬性在此 Controller 的所有 Action 之上。
(P231)
在 web.config 的 <system.web> 設置下包括一個 <authentication> 設置,其中的 <forms> 有個 loginUrl 可設置當許可權不足時應該轉向的地址。
【第07章】
(P245)
我們在開發 ASP.NET MVC 時,經常有一句口頭禪 : “Model 要重、 Controller 要輕、 View 要夠笨” 。
(P246)
若要使用 C# 語言來撰寫 Razor 頁面,記得 View 頁面的副文檔名必須使用 cshtml 才行。若要用 VB.NET 語言來撰寫 Razor 頁面的話,要用 vbhtml 當成 View 頁面的副文檔名才行。
在頁面中輸出一段含有空白字元或運運算元的結果時,必須在前後加上一個小括弧。
(P247)
在頁面中執行多行 C# 代碼時,必須在前後加上一個大括弧。
由於 @{到} 之間屬於一個 C# 代碼區段,在撰寫代碼時必須符合 C# 語言規範,也就是每段句都要由分號結尾。
如果要在多行 C# 代碼的 Razor 語法中插入 HTML 或其他文字內容,必須在每一行最前面加上一個 “@:” 符號,而且加上 “@:” 符號的這行代碼里,也可以再加上其他 Razor 變數。
如果要在 Razor 檢視頁面中輸出 “@” 符號,可以用 “@” 符號當成跳脫字元。
(P249)
純文字在 Razor 的代碼區塊中會自動被視為是 C# 陳述句。
如果要在代碼區塊中輸出大量文字,只要在代碼區塊里的前後加上一組 HTML 標簽即可, Razor 會智能地判斷出這不是一段 C# 語法,而是一段 HTML 標簽文字,如此一來,如果在大範圍的代碼區段中就不用在每一行前面加上 “@:” 符號了。
(P259)
_ViewStart.cshtml 文件不僅能出現在 /Views/ 目錄下,任何與 Controller 同名的 Views 子目錄下也都能出現相同的 _ViewStart.cshtml 文件,如此一來,就可以讓不同的 Controller 預設載入不同的主版頁面。
(P262)
由於 Razor 頁面有其執行順序,主要是先執行 View 再執行 Layout 主版頁面,因為 View 與 Layout 共用一個 ViewDataDictionary 實體,因此,如果要將數據傳遞到 Layout 頁面中一樣可以通過 ViewData 或 ViewBag 的方式傳遞過去。
(P267)
請註意 @model 語法的第一個字是小寫字母的 m ,千萬不要和 Model 給搞混了。
在 Razor 頁面里可以在頁面最上方通過 @using 引用這一個 View 頁面里會用到的命名空間,以簡化程式的長度。
(P268)
從 Action 取得數據,在 ASP.NET MVC 可區分成兩種方式,一種是 “使用弱型別取得數據”,另一種則是 “使用強類型取得數據”,兩者的差別在於 View 頁面最上方聲明的方式。
如果 View 頁面使用弱型別接收來自 Controller 的數據,在 View 頁面里完全不需要有任何聲明,數據可以從 ViewData 、 ViewBag 或 TempData 取得,在頁面中也可以通過 @Model 屬性,取得從 Action 傳來的 ViewData.Model 數據模型,但 @Model 數據模型的型別將會是 object ,所以算是弱型別的傳值方式。
如果 View 頁面使用強型別方式接收來自 Controller 的數據,那麼,必須在 View 頁面的第一行使用 @model 關鍵字引入一個 View 頁面專用的數據模型型別參考。
(P276)
Html 輔助方法並沒有 File 方法,因此必須用 TextBox 方法來代替,並傳入第三個參數將內建的 type 屬性換成 file 即可。
(P278)
在 HTML 輔助方法的幫助下,會同時將 id 屬性賦予和 name 屬性一樣的值。
(P288)
使用分部視圖不一定需要建立相關的 Action ,因為它僅僅是片段的 HTML ,且調用時,也不會調用 Action 來執行。
【第09章】
(P331)
在 ASP.NET MVC 開發流程中,實務上都會先定義 Model 數據模型,再規劃 Controller ,最後再來開發 View 視圖頁面。
(P390)
在撰寫提供遠程驗證的 Action 時,有四個註意事項 :
1. 傳入的參數名稱必須等同於要驗證的那個屬性名稱。
2. 結果必須使用 JsonResult 回傳,可以使用 System.Web.Mvc.Controller 基類中的 Json 輔助方法幫助我們輸出這個結果。
3. 回傳的信息,只要響應結果是 true ,就代表驗證成功,如果回傳 false 就會被視為驗證失敗,並顯示預設的錯誤消息。除此之外,只要任何不是 true 或 false 的屬性,都會被視為驗證失敗時的自定義錯誤消息。
4. 如果你使用 HTTP GET 方法進行驗證,那麼你的 Json 輔助方法必須輸入第二個參數,明確指定允許 GET 方法調用這個動作。
【第10章】
(P399)
在 ASP.NET MVC 里,這兩種攻擊情境都內建了相對應的防護措施,要防止 “你的網站攻擊別人的網站” ,可以使用 Html.Encode 、 Url.Encode 或 Ajax.JavaScriptString.Encode 輔助方法;而防止 “別人的網站攻擊你的網站” 則使用 AntiForgeryToken 輔助方法。
若使用 Razor 語法,任何通過 @ 方式輸出的內容預設都是經過 HTML 編碼過的,因此不需要特別使用 Html.Encode 輔助方法。