1. 程式人生 > >【asp.net core 系列】5 佈局頁和靜態資源

【asp.net core 系列】5 佈局頁和靜態資源

# 0. 前言 在之前的4篇的內容裡,我們較為詳細的介紹了路由以及控制器還有檢視之間的關係。也就是說,系統如何從使用者的HTTP請求解析到控制器裡,然後在控制器裡處理資料,並返回給檢視,在檢視中顯示出來。這一篇我將為大家介紹基礎的最後一部分,佈局頁和靜態資源引入。 # 1. 佈局頁 在控制器和檢視那一篇,我們瞭解到`_ViewStart` 裡設定了一個Layout屬性的值,這個值正是用來設定佈局頁的。所謂的佈局頁,就是檢視的公用程式碼。在實際開發中,佈局頁通常存放我們為整個系統定義的頁面框架,視圖裡寫每個檢視的頁面。 回顧一下,預設的`_ViewStart`裡的內容是: ```html @{ Layout = "_Layout"; } ``` 預設的佈局頁指定的是名為`_Layout`的佈局頁,在本系列第三篇中,我們得知這個檢視應當在Shared資料夾下,那我們進去看一下這個檢視有什麼內容: ```html
@RenderBody()
© 2020 - MvcWeb - Privacy
@RenderSection("Scripts", required: false) ``` 這是預設的佈局頁內容,看著挺多的,但是除了一些html程式碼,裡面還有一些關鍵的地方需要注意。 ## 1.1 RenderSection RenderSection 分部渲染,在頁面中建立一個標記,表示這個頁面塊將在子檢視(或者是路由的實際渲染檢視)中新增內容。 來,我們看一下微軟官方給的註釋: > In layout pages, renders the content of the section named `name`. 意思就是在佈局頁中,渲染名稱為name的分部內容。 新建立一個分佈頁,名稱為`_Layout1`: ```html @RenderSection("SectionDemo") ``` 這個佈局頁裡什麼都沒有,只有一個RenderSection。現在我們新建一個控制器: ```c# using Microsoft.AspNetCore.Mvc; namespace MvcWeb.Controllers { public class RenderTestController : Controller { public IActionResult Index() { return View(); } } } ``` 建立對應的檢視: > Views / RenderTest/Index.cshtml 先設定佈局頁為`_Layout1`: ```html @{ Layout = "_Layout1"; } ``` 先試試啟動應用,訪問: > http://localhost:5006/RenderTest/Index 正常情況下,你應該能看到這個頁面: ![image-20200603223436499](https://img2020.cnblogs.com/other/1266612/202006/1266612-20200605142538325-1554263569.png) 仔細看一下資訊,意思是在 RenderTest/Index.cshtml 檢視中沒有找到 SectionDemo 的分部內容。 那麼,如何在檢視中設定分部內容呢? ```html @{ Layout = "_Layout1"; } @section SectionDemo{

你好

} ``` 使用 @section <Section 名稱> 後面跟一對大括號,在大括號中間的內容就是這個section(分部)的內容。 重啟應用,然後重新整理頁面,你能看到這樣的頁面: ![image-20200603224339206](https://img2020.cnblogs.com/other/1266612/202006/1266612-20200605142538639-575314465.png) 如果不做特殊要求的話,定義在佈局頁中的分部塊,檢視必須實現。當然,RenderSection還有一個引數,可以用來設定分部不是必須的: ```c# public HtmlString RenderSection(string name, bool required); ``` ## 1.2 RenderBody 先看下微軟給的官方註釋: > In a Razor layout page, renders the portion of a content page that is not within a named section. 簡單講,如果在佈局頁中設定了@RenderBody,那麼在使用了這個佈局頁的視圖裡所有沒被分部塊包裹的程式碼都會渲染到佈局頁中聲明瞭@RenderBody的地方。 修改`_Layout1.cshtml`: ```html

RenderBody 測試 -之前

@RenderBody()

RenderBody 測試 -之後

``` 修改`RenderTest/Index.cshtml`: ```html @{ Layout = "_Layout1"; } RenderBody測試

我是檢視的內容!

``` 重啟應用,重新整理剛剛訪問的頁面: ![image-20200603230213462](https://img2020.cnblogs.com/other/1266612/202006/1266612-20200605142539002-2040442999.png) 可以看出,RenderBody渲染的位置。 # 2. 靜態資源引入 通常情況下,靜態資源的引入與HTML引用js和css等資源是一致的,但是對於我們在編寫系統時自己建立的指令碼和樣式表,asp.net core提供了不同的處理方式。那就是伺服器端壓縮功能。 asp.net core 3.0 的mvc 預設專案是不啟動這個功能的,需要我們額外的開啟支援。 ## 2.1 開啟支援 先引入 **BuildBundleMinifier** ```bash cd MvcWeb # 切換目錄到MvcWeb專案下 dotnet add package BuildBundleMinifier ``` 建立 bundleconfig.json ```json [ { "outputFileName": "wwwroot/css/site.min.css", "inputFiles": [ "wwwroot/css/site.css" ] }, { "outputFileName": "wwwroot/js/site.min.js", "inputFiles": [ "wwwroot/js/site.js" ], "minify": { "enabled": true, "renameLocals": true }, "sourceMap": false } ] ``` 每個節點允許設定項: - outputFileName 生成的捆綁壓縮檔案,通常路徑攜帶wwwroot - inputFiles 陣列,包含要壓縮到此次輸出檔案的檔案路徑,會按照新增的順序依次加入 - minify 輸出型別的縮小選項,可選。 預設是 enabled: true - sourceMap 表示是否為捆綁的檔案生成源對映的標記 - sourceMapRootPath 源對映檔案的路徑 ## 2.2 使用 正常情況下在佈局頁中,把壓縮後的檔案路徑引入即可。不過在開發中,通常按照以下方式引用: ```html ``` 注: asp-append-version 表示在引用路徑追加一個版本號,這是針對html靜態資源快取的問題的一個解決方案,這一步是由程式決定的。 environment表示環境,現在大家知道這個寫法就行,在接下來的篇幅會講。 # 3. 靜態資源目錄 我們知道到目前為止,我們的靜態資源都是在wwwroot目錄下。那麼我們是否可以修改或者新增別的目錄作為靜態資源目錄呢? 在Startup.cs檔案內的Configure方法下有這樣一行程式碼: ```c# app.UseStaticFiles(); ``` 這行程式碼的意思就是啟用靜態檔案,程式自動從 wwwroot尋找資源。那麼,我們就可以從這個方法入手,設定我們自己的靜態資源: ```c# public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app, StaticFileOptions options); ``` 我們找到了這個方法的另一個過載版本,裡面有一個引數類: ```c# public class StaticFileOptions : SharedOptionsBase { public StaticFileOptions(); public StaticFileOptions(SharedOptions sharedOptions); public IContentTypeProvider ContentTypeProvider { get; set; } public string DefaultContentType { get; set; } public HttpsCompressionMode HttpsCompression { get; set; } publi