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

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 一、概述 在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 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...