主頁 > .NET開發 > 《ASP.NET MVC 4 開發指南》 - 學習筆記

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

2020-09-09 23:09:34 .NET開發

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/79.html

標籤:ASP.NET MVC

上一篇:checkbox橫向選擇

下一篇:《ASP.NET MVC 企業級實戰》 - 學習筆記

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more