《ASP.NET MVC 4 開髮指南》 - 學習筆記

来源:https://www.cnblogs.com/GATTACA2011/archive/2020/05/21/12928167.html

《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 輔助方法。


您的分享是我們最大的動力!

更多相關文章
  • 一、概述 在Window伺服器部署程式後,可能因為代碼的不合理或者其他各種各樣的問題,會導致CPU暴增,甚至達到100%等情況,嚴重危及到伺服器的穩定以及系統穩定,但是一般來說對於已發佈的程式,沒法即時看到出問題的代碼,而微軟提供了一個很好的工具“WinDbg”,使得我們能夠回溯問題。下麵講一下操作 ...
  • 前言, Blazor Assembly 需要最少 1.9M 的下載量. ( Blazor WebAssembly 船新項目下載量測試 , 僅供參考. ) 隨著程式越來越複雜, 引用的東西越來越多, 需要更多的下載量 , 有一些網站的網路可能較差, 載入這些文件需要一定的時間. 對於一些網站而言, 它 ...
  • 背景介紹:基於netcore2.2開發api介面程式,自定義了一個異常捕獲中間件,用於捕獲未經處理的異常以及狀態碼404、500等訪問(設計的出發點就是,出現了非200的響應,我這邊全部會進行處理成200,並返回固定格式的JSON格式數據),併進行統一的信息返回。 返回的JSON實體定義如下: 中間 ...
  • 前言: 昨天 Blazor WebAssembly 3.2 正式發佈了. 更新 VS2019後就能直接使用. 新建了兩個PWA項目, 一個不用asp.net core (靜態部署), 一個使用asp.net core (項目模板與伺服器交互) 其中下載量主要是預壓縮有沒有被使用 , 分別為 3.2M ...
  • 上一篇文章(https://www.cnblogs.com/meowv/p/12916613.html)使用自定義倉儲完成了簡單的增刪改查案例,有心的同學可以看出,我們的返回參數一塌糊塗,顯得很不友好。 在實際開發過程中,每個公司可能不盡相同,但都大同小異,我們的返回數據都是包裹在一個公共的模型下麵 ...
  • 現象: 用Microsoft.Office.Interop.Outlook取得日曆項,然後根據業務要求篩選。 items.Restrict方法中的篩選器,使用like進行模糊查詢時,會出COMException異常。 代碼: 1 //folder取得前略 2 3 Outlook.Items item ...
  • 單位的項目需要測溫,同事買了個海康威視的人體測溫機芯,型號位:TB 4117 3/S,給了一份pdf的說明書。 按說明書把設備連接設置好,從官網下載了sdk,我的個乖乖,壓縮包就有70多M,把他家的所有東西都給了我,有各種Demo,就是沒有測溫的,暈死,差點想打退堂鼓不玩了。 最後,最後得到如下成果 ...
  • 前言 Quartz3與Quartz2的主要區別有兩點: 1,Quartz3將它的資源類庫拆的更細了,比如,想使用Quartz3開發,最少要引用Quartz,Quartz.Jobs,Quartz.Plugins這三個類庫。 2,Quartz3整體上使用的是非同步創建實例,所以我們使用時就必須要async ...
一周排行
  • 一:背景 1. 講故事 曾今在項目中發現有同事自定義結構體的時候,居然沒有重寫Equals方法,比如下麵這段代碼: static void Main(string[] args) { var list = Enumerable.Range(0, 1000).Select(m => new Point ...
  • 最近一個朋友有個關於素數的小東西要寫一下,素數是什麼呢?除了1和他本身不能被其他數整除,那麼這個數就是素數,1除外哦。我們知道概念那就很簡單了,直接代碼擼起。 ...
  • 前言 在開發編程中,我們經常會遇到功能非常相似的功能模塊,只是他們的處理的數據不一樣,所以我們會分別採用多個方法來處理不同的數據類型。但是這個時候,我們就會想一個問題,有沒有辦法實現利用同一個方法來傳遞不同種類型的參數呢? 這個時候,泛型也就因運而生,專門來解決這個問題的。 泛型是在C 2.0就推出 ...
  • 本文章主要用於介紹在Asp.Net Mvc(C#)中使用Fleck製作一個Html5的即時聊天室,含有完整代碼和演示Demo。 ...
  • 出庫單的功能。能學習了出庫單管理之後,WMS的 主體功能算是完成了。當然一個成熟的WMS還包括了盤點,報表,策略規則,移庫功能及與其他系統(ERP、TMS等)的介面,實現無縫集成,打破信息孤島,讓數據實時、準確和同步。 ...
  • Data StructureThere're two types of variables in C#, reference type and value type.Enum:enum Color{Red=0,Green=1}//equals to enum Color{Red,//start fr... ...
  • 0. 前言 該項目使用Maven進行管理和構建,所以需要預先配置好Maven。嗯,在這個系列里就不做過多的介紹了。 1. 創建項目 先創建一個pom.xml 文件,添加以下內容: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http: ...
  • API 概述 API(Application Programming Interface),應用程式編程介面。 Java API是一本程式員的 字典 ,是JDK中提供給我們使用的類的說明文檔。 這些類將底層的代碼實現封裝了起來,我們不需要關心這些類是如何實現的,只需要學習這些類如何使用即可。 所以我 ...
  • 女程式員是這麼徵婚的: SELECT * FROM 男人們 WHERE 未婚=true and 同性戀=false and 有房=true and 有車=true and 條件 in (帥氣,紳士,大度,氣質,智慧,溫柔,體貼,會浪漫,活潑,可愛,最好還能帶孩子) and 年齡 between(24 ...
  • 有很多剛學習軟體測試的小伙伴,都會在網路上找尋各種學習資料,去提升自己的專業技能水平。因此,我決定定期分享我整理收集的一些軟體測試的測試工具下載、面試寶典、視頻教學合集。都整理好了,有需要的可以關註我(獲取方式在文末) 軟體測試的學習,不止是基礎理論,還需要學習測試工具的用法,如介面工具Postma ...