《ASP.NET MVC 5 高級編程》 - 學習筆記

《ASP.NET MVC 5 高級編程》

========== ========== ==========
[作者] (美) Jon Galloway (美) Brad Wilson (美) K. Scott Allen (美) David Matson
[譯者] (中) 孫遠帥
[出版] 清華大學出版社
[版次] 2015年02月 第1版
[印次] 2015年02月 第1次 印刷
[定價] 59.80元
========== ========== ==========

【第01章】 

(P001) 

證明軟件框架和模式價值最好的方法就是展示它們在實際場景中的應用。

(P007) 

雖然 ASP.NET API 包含在 ASP.NET MVC 4 中,但它可以單獨使用。事實上,它與 ASP.NET 不存在任何依賴關係,並且可以自託管 —— 也就是說,獨立於 ASP.NET 和 IIS 。

(P014) 

MVC 5 是完全 bin 部署的,這意味着所有必要的程序集都包含在應用程序的 bin 目錄中。只要服務器上有 .NET 4.5 ,就可以進行安裝。

【第02章】 

(P023) 

URL 並不與存儲在 Web 服務器磁盤上的文件有直接對應關係,而是與控制器類的方法有關。

路由子系統在前面,之後纔是控制器。

(P024) 

MVC 提供的是方法調用結果,而不是動態生成的 (又名腳本) 頁面。

(P025) 

在 ASP.NET MVC 中,每個請求都被路由到控制器的一個方法 (又稱操作),該控制器全權負責解釋這些請求,如有必要,還要操縱模型,然後選擇一個視圖反饋給用戶。

(P034) 

利用方法 HttpUtility.HtmlEncode 來預處理用戶輸入,這樣就能阻止用戶用鏈接向視圖中注入 JavaScript 代碼或 HTML 標記。

ASP.NET MVC 的默認路由約定,就是將操作方法名稱後面 URL 的這個片段作爲一個參數,該參數的名稱爲 ID 。

【第03章】 

(P036) 

視圖實際上就是應用程序的 “大使” 。

(P037) 

視圖總是被控制器渲染,因爲控制器爲它提供了要渲染的數據。

(P039) 

ViewBag 具有侷限性,但是如果只是向視圖傳遞少量數據,它還是很有用的。

(P042) 

可以從控制器向視圖傳遞一個在兩端都是強類型的模型對象。

如果不想輸入模型類型的完全限定類型名,可使用 @using 關鍵字聲明。

對於在視圖中經常使用的名稱空間,一個較好的方法就是在 Views 目錄下的 web.config 文件中聲明。

(P045) 

顯示 “Add View” 對話框最簡單的方法就是在操作方法上右擊。

(P049) 

Razor 中的核心轉換字符是 “at” 符號 (@) 。這個單一字符用做 “標記-代碼” 的轉換字符,有時也反過來用做 “代碼-標記” 的轉換字符。

(P053) 

有些情況下,需要顯式地渲染一些不應該採用 HTML 編碼的值,這時可以採用 Html.Raw 方法來保證該值不被編碼。

(P054) 

可以用 “@@” 來編碼 “@” 以達到顯示 “@” 的目的。

(P055) 

@RenderBody 是一個佔位符,用來標記使用這個佈局的視圖將渲染它們的主要內容的位置。

【第04章】 

(P062) 

在 Visual Studio 中,既可以使用 Build | Build Solution 菜單項,也可以使用鍵盤快捷鍵 Ctrl + Shift + B 來編譯應用程序。

(P063) 

基架對於創建應用程序來說不是不可或缺的,但是利用基架會爲應用程序開發節省很多時間。

(P079) 

瀏覽器會自動收集用戶在表單中輸入的所有信息並將這些值 (及其相關的 name 屬性值) 放在請求中一起發送。

【第05章】 

(P086) 

action 特性用以告知 Web 瀏覽器信息發往哪裏,所以 action  就順理成章地包含一個 URL 。

當用戶使用 HTTP GET 請求提交時,瀏覽器會提取表單中輸入元素的 name 特性值及其相應的 value 特性值,並將它們放入到查詢字符串中。

如果不想讓瀏覽器把值放入查詢字符串中,而是想放入 HTTP 請求的主體中,就可以給 method 特性賦值 post 。

(P087) 

通常情況下,在 Web 應用程序中, GET 請求用於讀操作, POST 請求用於寫操作 (通常包括更新、創建和刪除) 。

(P089) 

可以通過視圖的 Html 的屬性調用 HTML 輔助方法。相應地,也可以通過 Url 屬性調用 URL 輔助方法,通過 Ajax 屬性調用 AJAX 輔助方法。所有這些方法都有一個共同的目標 : 使視圖編碼變得容易。

(P091) 

在 ASP.NET MVC 框架的重載版本中,幾乎每一個 HTML 輔助方法都包含 htmlAttributes 參數。

所有的 HTML 輔助方法在渲染 HTML 時會將屬性名中的下劃線轉換爲連字符。

(P093) 

ValidationSummary 輔助方法可以用來顯示 ModelState 字典中所有驗證錯誤的無序列表。

(P095) 

TextBox 輔助方法渲染一個 type 特性爲 text 的 input 標籤。我們一般利用 TextBox 輔助方法接收用戶自由形式的輸入。

(P096) 

label 的作用就是爲其他輸入元素顯示附加信息,這樣可以爲用戶提供人性化的界面,從而增強應用程序的可訪問性。

label 的 for 特性應該包含相關輸入元素的 id 。

如果用戶單擊 label ,那麼瀏覽器會把焦點傳送給相關的輸入控件。

(P097) 

當 ModelState 字典中的某一特定字段出現錯誤時,可以使用 ValidationMessage 輔助方法來顯示相應的錯誤提示信息。

(P098) 

輔助方法提供了對 HTML 細粒度控制的同時帶走了構建 UI (要在合適的位置顯示控件、標籤、錯誤信息和值) 的乏味工作。

在 ViewBag 對象中的所有值也可以通過 ViewData 得到。

(P099) 

在 id 特性中包含 (.) 是非法的。

如果沒有有效的 id 特性,就無法執行帶有 JavaScript 庫 (如 jQuery) 的客戶端腳本。

(P100) 

輔助方法在查找強類型模型對象之前,會首先查看 ViewBag 。

(P101) 

一般情況下,可爲處理模型數據的每個輔助方法找到一個與其對應的強類型方法。

(P102) 

ModelState 是模型綁定的副產品,並且存儲模型綁定期間檢測到的所有驗證錯誤,以及用戶提交用來更新模型的原始值。

(P104) 

CheckBox 輔助方法是唯一一個渲染兩個輸入元素的輔助方法。

ActionLink 輔助方法能夠渲染一個超鏈接 (錨標籤) ,渲染的鏈接指向另一個控制器操作。

當鏈接的操作所在控制器與用來渲染當前視圖的控制器一樣時,只需要指定操作的名稱。

當需要一個指向不同控制器操作的鏈接時,可通過 ActionLink 方法的第三個參數來指定控制器名稱。

(P105) 

儘管 RouteLink 輔助方法和 ActionLink 輔助方法遵循相同的模式,但是 RouteLink 只可以接收路由名稱,而不能接收控制器名稱和操作名稱。

URL 輔助方法與 HTML 的 ActionLink 和 RouteLink 輔助方法相似,但它不是以 HTML 標記的形式返回構建的 URL ,而是以字符串的形式返回這些 URL 。

(P106) 

Content 輔助方法特別有用,因爲它可以把應用程序的相對路徑轉換成絕對路徑。

ASP.NET MVC 5 使用的是 Razor 的第三個版本,波浪號當出現在 script 、 style 和 img 元素的 src 特性時就會被自動解析。

RenderPartial 輔助方法與 Partial 非常相似,但 RenderPartial 不是返回字符串,而是直接寫入響應輸出流。出於這個原因,必須把 RenderPartial 放入代碼塊中,而不能放在代碼表達式中。

【第06章】 

(P116) 

每個驗證特性都允許傳遞一個帶有自定義錯誤提示信息的參數。

(P117) 

默認情況下,ASP.NET MVC 框架在模型綁定時執行驗證邏輯。

在操作方法帶有參數時,就會隱式地執行模型綁定。

也可以利用控制器的 UpdateModel 或 TryUpdateModel 方法顯式地執行模型綁定。

【第07章】 

(P129) 

身份驗證是指通過使用某種形式的登錄機制來覈實用戶的身份。

授權驗證是用來覈實登錄站點的用戶是否在他們的權限內執行操作。

Authorize 特性不帶任何參數,只要求用戶以某種角色身份登錄網站。

(P133) 

Authorize 特性是一個過濾器,也就是說,它能先於相關控制器操作執行。

(P137) 

全局過濾器只針對 MVC 控制器操作,記住這一點很重要。它不能保障 Web Forms 、 靜態內容或其他 ASP.NET 處理程序的安全。

(P140) 

技術上講,設計 OAuth 協議是出於授權的目的,但是該協議常常被用來進行身份驗證。

(P150) 

Html.Encode 是程序員最好的 “朋友” 。

(P161) 

防禦重複提交攻擊的最簡單方法就是,使用 [Bind] 特性顯式地控制需要由模型綁定器綁定的屬性。

[Bind] 特性既可以放在模型類上,也可以放在控制器操作參數中。

(P162) 

避免直接綁定到數據模型也是有效防禦重複提交攻擊的一種方式。它通過使用一個視圖模型 (View Model) ,只緩存允許用戶設置的屬性來阻止攻擊。

【第08章】 

(P171) 

ASP.NET MVC 5 中主要的 Ajax 特性要麼是基於 jQuery 構建,要麼是擴展的 jQuery 特性。

(P172) 

jQuery 擅長在 HTML 文檔中查找、遍歷和操縱 HTML 元素。一旦找到元素, jQuery 就可以方便地在其上進行操作。

jQuery 函數對象可以用來訪問 jQuery 特性。

(P173) 

當傳遞一個函數作爲第一個參數時, jQuery 就會假定這個函數是要在瀏覽器完成構建 (由服務器提供的) HTML 頁面中的文檔對象模型 (Document Object Model , DOM) 後立即執行,換句話說,這個函數在從服務器加載完 HTML 頁面之後執行。

jQuery 利用 JavaScript 的函數式編程特性,經常把創建的或傳遞的函數作爲 jQuery 方法的參數。

(P174) 

選擇器是指傳遞給 jQuery 函數的、用來在 DOM 中選擇元素的字符串。

jQuery 選擇器的語法正是派生於 CSS 3.0 選擇器的語法,並在其基礎上做了一些補充。

jQuery 的 on 方法 (以及對應的 off 方法,用於取消訂閱事件) 是在 jQuery 1.7 中引入的,用於爲事件綁定提供一個統一的 API 。 on 方法取代了原來的 bind 、 live 和 delegate 方法;事實上,如果查看源代碼,可看到 bind 、 live 和 delegate 方法只是將調用傳遞給了 on 方法。

(P175) 

一旦選擇了一些 DOM 元素或是在一個事件處理程序內, jQuery 就可以很容易地操縱頁面上的元素,讀取或設置它們的特性值,添加或移除它們的 CSS 類等。

jQuery 包含了向 Web 服務器回發異步請求所需的所有功能。可以用 jQuery 來生成 POST 請求或 GET 請求,並且當請求完成 (或出現錯誤) 時 jQuery 會發出通知。

(P182) 

必須引用 jquery.unobtrusive-ajax.js 腳本,才能讓 Ajax 輔助方法的 Ajax 功能生效。如果在使用 Ajax 輔助方法時發生問題,這時應該首先檢查的地方。

可以把腳本引用添加到應用程序的 _Layout 視圖中,也可以僅添加到使用 Ajax 輔助方法的視圖中。除非在網站中發出大量 Ajax 請求,否則建議僅把腳本引用添加到單獨的視圖中。

(P196) 

jQuery UI 可能是最流行的 jQuery 插件集合,也是最流行的 NuGet 包之一。

jQuery UI 是一個包含效果和小部件的 jQuery 插件。與所有插件類似,它緊密地集成了 jQuery ,並且擴展了 jQuery 中的 API 。

【第09章】 

(P215) 

在操作方法級別指定路由特性時,會覆蓋控制器級別指定的任何路由特性。

(P223) 

特性路由直接綁定到方法和控制器,而不是僅指定名稱,這意味着它們更加精確。

(P224) 

只需要記住,除非路由提供了 controller 和 action 參數,否則 MVC 不知道爲 URL 運行哪些代碼。

【第11章】 

(P272) 

應用程序頻繁地使用 HTTP 和 JSON 作爲通信渠道訪問主頁。當今的應用程序如果不能提供某種形式的遠程訪問 API 和/或 手機應用,就不能認爲它已經 “完成” 。

ASP.NET MVC 在接收表單數據生成 HTML 方面功能非常強大; ASP.NET Web API 在接收和生成像 JSON 和 XML 等結構化數據方面功能非常強大。

(P273) 

Web API 直接把結果模型對象作爲響應來渲染。

(P283) 

自託管和 Web 託管之間的主要區別在於路由的運行時刻 : 對於 Web 託管,ASP.NET 運行路由非常早;但在自託管情形中, Web API 運行路由的時刻就非常晚。

【第12章】 

(P290) 

HTML 應用程序,也與人稱之爲單頁應用程序或 SPA (Single Page Application) ,是一個複雜的事物。

管理複雜性的技術通常都是創建一個可以隱藏複雜性的框架。

(P291) 

爲什麼要在客戶端使用模型、視圖和控制器呢?其實和服務器端使用的原因一樣 —— 維持代碼的順序,把不同功能分在不同的抽象中。

Web API 模板也有 ASP.NET MVC 支持,但只提供一個首頁作爲起始點。對於應用程序的需求,這樣做是很完美的。

(P293) 

Angular 核心指令都有一個 “ng” 前綴,這裏 “ng” 即是 Angular 的簡寫。

“ng-app” 是 Angular 的應用程序引導指令。

“ng-app” 告知 Angular 跳入並初始化應用程序,並尋找其他內部指令和模板來控制 DOM 節,這一過程通常被稱作編譯 DOM 。

(P298) 

Angular 控制器主要用來管理 DOM 節,構建模型。只要與之關聯的 DOM 區域仍在展現, Angular 控制器就是有狀態的、存活的。

【第13章】 

(P321) 

ASP.NET MVC 框架充分利用了擴展方法。大部分用來在視圖中生成表單的 HTML 輔助方法都是 HtmlHelper 、 AjaxHelper 或 UrlHelper 類的擴展方法。

(P322) 

依賴注入的最常見形式是構造函數注入 (constructor injection) 。

(P323) 

屬性注入 (property injection) 是一種不太常見的依賴注入方式。

(P324) 

依賴注入容器便是使依賴解析變得簡單的一種方式。依賴注入容器是一個可以作爲組件工廠使用的軟件庫,它可以自動檢測和滿足裏面元素的依賴需求。依賴注入容器 API 的使用接口看起來很像服務定位器,因爲請求其執行的主要操作將根據類型提供一些組件。

(P329) 

視圖引擎的主要任務是把視圖的名稱轉換爲視圖實例。

【第14章】 

(P343) 

ASP.NET 核心基礎結構主要由 IHttpModule 和 IHttpHandler 接口,以及 HttpRequest 和 HttpResponse 等類的 HttpContext 層次結構組成。這些也是所有 ASP.NET 構建的基礎類,無論是 Web Forms 、 MVC 還是 Web Pages 都是在其上構建。

【第15章】 

(P366) 

HTML 和 Ajax 輔助方法可以訪問 ViewContext ,因爲它們只能從視圖中調用,而 URL 輔助方法可以訪問 ControllerContext ,因爲它們既可以從控制器中調用,也可以從視圖中調用。

【第16章】 

(P395) 

默認基架器使用 Text Template Transformation (通常稱爲 T4) 生成代碼。 T4 是一個集成到 Visual Studio 中的代碼生成器引擎。

(P423) 

使用同步管道的指導原則如下 : 

1. 操作簡單或者能在短時間內執行完畢;

2. 簡單性和可測試性是重要的;

3. 操作是 CPU 密集型,而非 IO 密集型;

使用異步管道的指導原則如下 : 

1. 測試結果表明阻塞操作是站點性能的瓶頸;

2. 並行性比代碼簡單更重要;

3. 操作是 IO 密集型,而非 CPU 密集型;

把一個操作轉換爲一個異步操作的一些要求 : 

1. 操作方法必須使用 async 修飾符標記爲異步;

2. 操作必須返回 Task 或 Task<ActionResult> ;

3. 方法中的任何異步操作使用 await 關鍵字掛起操作,直到調用完成;
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章