ASP.NET Core 入門教程 6、ASP.NET Core MVC 視圖佈局入門

来源:https://www.cnblogs.com/ken-io/archive/2018/11/12/aspnet-core-tutorial-mvc-view-layout-section.html
-Advertisement-
Play Games

一、前言 1、本教程主要內容 ASP.NET Core MVC (Razor)視圖母版頁教程 ASP.NET Core MVC (Razor)帶有Section的視圖母版頁教程 ASP.NET Core MVC (Razor)視圖全局代碼(_ViewStart.cshtml)教程 2、本教程環境信息 ...


一、前言

1、本教程主要內容

  • ASP.NET Core MVC (Razor)視圖母版頁教程
  • ASP.NET Core MVC (Razor)帶有Section的視圖母版頁教程
  • ASP.NET Core MVC (Razor)視圖全局代碼(_ViewStart.cshtml)教程

2、本教程環境信息

軟體/環境說明
操作系統 Windows 10
SDK 2.1.401
ASP.NET Core 2.1.3
IDE Visual Studio Code 1.28
瀏覽器 Chrome 70

本篇代碼以下代碼進行調整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02

3、準備工作

VS Code 本身不提供 ASP.NET Core MVC 視圖引擎(Razor)的智能感知。
幸運的是,VS Code C#擴展 從 1.17.0 版本開始支持Razor視圖引擎的智能感知。

所以,我們要將VS Code C#擴展升級到最新版本。

二、母版頁視圖模板

網頁中往往有通用的佈局,比如導航、底部等等,這些頁面中共用的部分,就需要放在母版頁裡面。
這樣每個頁面只用關註本頁面要完成的功能/內容即可。提高了開發效率,也降低了公共部分的維護成本。

Razor視圖引擎原生提供了Layout的概念,作為視圖佈局的基礎,可以讓我們在視圖中引用另外一個視圖作為該視圖的母版。

1、創建佈局頁(Layout)作為母版頁

在項目根目錄Views文件夾中創建子目錄Shared,併在Shared目錄中創建母版頁 _Layout.cshtml

通常公共的Razor視圖文件名都以_開頭

<html>
    <head>
        <title>@ViewBag.Title - Ken.Tutorial</title>
    </head>
    <body>
        <h1>Ken.Tutorial</h1>
        @RenderBody()
    </body>
</html>

@ViewBag.Title 用於當前應用該模板的視圖自定義標題
@RenderBody()表示渲染當前應用該母版的視圖,並填充到當前位置。

2、創建視圖作為子頁面

創建視圖並指定母版頁(Layout)

/Views/Home中新建文件Index.cshtml
在頁面中可以通過以下方式指定母版頁

  • 指定母版頁名字
@{
    Layout = "_Layout";
}
  • 指定母版頁完整路徑
@{
    Layout = " /Views/Shared/_Layout.cshtml";
}

以上兩種方式任選其一即可

@{
    Layout = "_Layout";
}
<h3>@ViewBag.Title</h3>
@ViewBag.Message

修改Action

調整 HomeController.cs中Action:Index(),通過視圖輸出Message

public IActionResult Index()
{
    ViewBag.Title = "Home";
    ViewBag.Message = "Hello World ! -ken.io";
    return View();
}

3、訪問測試

啟動項目,訪問 / 或者 /home/index 將會看到:

Ken.Tutorial
Home
Hello World ! -ken.io

三、帶片段的母版頁視圖模板

通過母版頁,我們可以方便的共用一些頁面內容或者功能。但是對於一些特殊的子頁面可能需要重寫母版頁中一些內容,或者在母版頁中插入自己想呈現的內容,而不是只能將子頁面呈現在固定的位置。

Razor視圖引擎提供了Section的概念,我們可以在視圖中定義Section,然後再母版視圖中通過RenderSection方式載入視圖定義的Section

1、Section的定義與載入

Section定義

Section定義在子頁面才有效。
Section定義示例:

 @section test{
     <p>Section Content</p>
 }

@section:定義Section的關鍵字
test:SectionName,命名規則同C#變數名一樣,字母或下劃線開頭後面可以跟字母、下劃線、數字

Section載入

在母版頁中可以通過@RenderSection()方法載入子頁面中定義的Section

RenderSection只有在母版頁(Layout)中使用才有效

  • 強制載入
@RenderSection("test")
  • 子頁面中有定義就載入
@RenderSection("test", false)
  • 子頁面中有定義就載入,沒有就顯示預設內容
@if(IsSectionDefined("test"))
{
    RenderSection("test");
}
else
{
    <p>Layout Content</p>
}

2、Section使用示例

創建Controller與Action

Controllers文件夾中創建LayoutController.cs

using System;
using Microsoft.AspNetCore.Mvc;

namespace Ken.Tutorial.Web.Controllers
{
    public class LayoutController : Controller
    {
        public IActionResult SectionDemo()
        {
            return View();
        }
    }
}

創建帶有Section視圖

Views文件夾中創建Layout文件夾並創建視圖文件:SectionDemo.cshtml

@{
    Layout = "_Layout";
    ViewBag.Title = "SectionDemo";
}
<h3>@ViewBag.Title</h3>
<p>Section Demo by ken.io</p>

@section footer{
    <p>Section Footer</p>
}

修改模板頁

修改 _Layout.cshtml 增加Section載入

<html>
    <head>
        <title>@ViewBag.Title - Ken.Tutorial</title>
    </head>
    <body>
        <div class="header">
            <h1>Ken.Tutorial</h1>
            <hr/>
        </div>

        <div class="content">
            @RenderBody()
        </div>

        <div class="footer">
            <hr/>
            @if(IsSectionDefined("footer"))
            {
                RenderSection("footer");
            }
            else
            {
                <p>Layout Footer</p>
            }
        </div>
    </body>
</html>

3、訪問測試

啟動項目,通過瀏覽器進行訪問測試://layout/sectiondemo

訪問 /,將看到:

Ken.Tutorial
Home
Hello World ! -ken.io
Layout Footer

訪問/layout/sectiondemo將看到:

Ken.Tutorial
SectionDemo
Section Demo by ken.io

Section Footer

四、視圖呈現之前的全局代碼

Razor視圖引擎,提供了在視圖呈現之前執行代碼的入口。
這個入口是一個約定的文件即:_ViewStart.cshtml,我們可以通過該文件定義全局視圖呈現前執行的代碼,也是定義某個文件夾下的視圖呈現前需要執行的代碼。
完整路徑示例:

  • /Views/_ViewStart.cshtml
  • /Views/Home/_ViewStart.cshtml

如果兩個_ViewStart.cshtml文件同時存在,那麼/Views/_ViewStart.cshtml的執行優先順序高於/Views/Home/_ViewStart.cshtml

全局代碼示例

Views文件夾下創建視圖文件_ViewStart.cshtml

@{
    Layout = "_Layout";
}

這裡我們通過全局代碼,將所有視圖的母版頁都指定為_Layout
這樣我們在視圖子頁面就不用逐一制定母版頁了。

如果我們將Index.cshtml中指定的Layout註釋掉

@{
    //Layout = "_Layout";
}

然後啟動項目,訪問 /,依然看到:

Ken.Tutorial
Home
Hello World ! -ken.io

局部全局代碼示例

/Views/Home文件夾下創建視圖文件_ViewStart.cshtml

@{
    Layout = null;
}

這裡我們局部全局代碼,將在/Views/Home文件夾下的所有視圖的母版頁都指定為null,預設不引用任何母版頁。

這時我們啟動項目,訪問 / ,將看到:

Home
Hello World ! -ken.io

五、備註

1、附錄

  • 本文代碼示例

https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-06

  • 本文參考

https://docs.microsoft.com/zh-cn/aspnet/core/mvc/views/overview?view=aspnetcore-2.1


本文首發於我的獨立博客:https://ken.io/note/asp.net-core-tutorial-mvc-view-layout-section

 


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

-Advertisement-
Play Games
更多相關文章
  • 作者:依樂祝 原本鏈接:https://www.cnblogs.com/yilezhu/p/9947905.html 引子 為什麼寫這篇文章呢?因為.NET Core的生態越來越好了!之前玩轉.net的時候操作Redis相信大伙都使用過一些組件,但都有一些缺點,如ServiceStack.Redis ...
  • 執行 鏈接 下載 ...
  • 1、簡述 private、 protected、 public、 internal 修飾符的訪問許可權。 private : 私有成員, 在類的內部才可以訪問。 protected : 保護成員,該類內部和繼承類中可以訪問。 public : 公共成員,完全公開,沒有訪問限制。 internal: 在 ...
  • 授權就是我們在用戶未登錄的情況下不允許訪問一些頁面,只有登錄後才能進行訪問一些頁面。 在mvc中我們可以使用ActionFilterAttribute來進行授權驗證來阻止一些未經授權的直接訪問的頁面。 首先再我們的項目中根目錄中創建一個文件夾命名為Filter,在該文件夾內創建一個普通的類,註意:類 ...
  • HTML JS API public ActionResult BatchDownloadFiles(string str, int type) { var idList = str.Split(',').ToList().ConvertAll(x => int.Parse(x)); MemoryS ...
  • 之前跑去做了一年多的iOS開發,被XCode噁心得不行。做人呢,最重要的是開心。所以我就炒了公司魷魚,挪了個窩回頭去做Windows開發了。 UWP什麼的很久沒有正兒八經寫了,國內的需求非常少。傳統的桌面開發倒是因為人越來越少了,需求還在,有少量還不錯的職位。現在在做WPF的項目,公司層面倒是很願意 ...
  • 頁面效果圖: 1 <div style="display: none;" id="formContainer"> 2 <form class="layui-form mySearchForm" lay-filter="editForm"> 3 <div class="layui-form-item" ...
  • https://www.cnblogs.com/divspan/gallery/image/223933.html ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...