《ASP.NET MVC 4 開發指南》javascript
========== ========== ==========
[做者] (臺) 黃保翕
[出版] 清華大學出版社
[版次] 2013年07月 第1版
[印次] 2013年07月 第1次 印刷
[訂價] 59.00元
========== ========== ==========html
【做者序】 java
要進入一個全新技術的領域,首要任務就是先感覺技術的價值,而後再進一步深刻研究技術的細節。web
【第01章】 數據庫
(P004) json
簡言之,只要是和 「數據」 有關的任務,都應該在 Model 裏完成定義。設計模式
(P006) 安全
簡言之,全部應該要顯示在網頁上的邏輯都是 View 負責的範圍。app
(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 輔助方法。