ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
一、前言
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
ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门的更多相关文章
- ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门
		一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ... 
- ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程
		原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ... 
- ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程
		原文:ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程-约定 因为 ASP.NET Core 是可以跨平台的 ... 
- ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
		一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MV ... 
- ASP.NET Core 入门笔记6,ASP.NET Core MVC 视图传值入门
		摘抄自:https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc-view-renderdata.html 如有侵权请告知 一.前言 1.本教 ... 
- Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis
		https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ... 
- JAVA入门教程 - idea 新建maven spring MVC项目
		用的是Idea2017版本.其他大同小异 1.新建项目 2.勾选Create from archetype 选中maven-archetype-webapp 3.输入项目名字. 4.下一步 5.点Fi ... 
- 【目录】ASP.NET Core 2.1 入门教程
		ASP.NET Core 2.1 快速学习.入门系列教程,这个入门系列教程为了帮助大家快速上手ASP.NET Core. 本教程包含且不限于: 使用VS Code开发ASP.NET Core应用 AS ... 
- 观看杨老师(杨旭)Asp.Net Core MVC入门教程记录
		观看杨老师(杨旭)Asp.Net Core MVC入门教程记录 ASP.NET Core MVC入门 Asp.Net Core启动和配置 Program类,Main方法 Startup类 依赖注入,I ... 
随机推荐
- [Swift]LeetCode769. 最多能完成排序的块 | Max Chunks To Make Sorted
			Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into som ... 
- String补充
			String类不可变和可变字符序列区别_字符串比较 String类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”.也就是指对象内部成员变量的值无法再改变, p ... 
- 解决SpringMVC中文乱码问题 -----这是服务器返回参数到前端中文乱码
			方法一,使用(produces = "application/json; charset=utf-8"): @RequestMapping(value="/getUser ... 
- java程序员的NodeJS初识篇
			摘要 作为一个一直用java来写后端的程序员用NodeJS来写后台,实在不是很爽.这里记下这两个月的NodeJS学习所遇之坑,与java转NodeJS的同仁共勉.学习时间不长,若有理解错误,望指正. ... 
- javascript ES6 新特性之 Promise,ES7 async / await
			es6 一经推出,Promise 就一直被大家所关注.那么,为什么 Promise 会被大家这样关注呢?答案很简单,Promise 优化了回调函数的用法,让原本需要纵向一层一层嵌套的回调函数实现了横向 ... 
- 华为oj之字符个数统计
			题目:字符个数统计 热度指数:4720 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127). ... 
- javascript深入理解js闭包(转载)
			此篇文章来源于http://www.jb51.net/article/24101.htm 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全 ... 
- 产品研发团队如何融合OKR与Scrum敏捷开发?
			「 OKR 」现在非常的火爆,很多公司都在使用,不仅国外的 Google.英特尔等大公司在用,国内的一线知名互联网企业今日头条和一些创业团队也都在使用. 那为什么「 OKR 」这么受欢迎呢,因为把它可 ... 
- Chapter 4 Invitations——14
			"Hi, Bella." “你好,Bella” "What's up?" I said as I was unlocking the door. “怎么了?” ... 
- 精读《useEffect 完全指南》
			1. 引言 工具型文章要跳读,而文学经典就要反复研读.如果说 React 0.14 版本带来的各种生命周期可以类比到工具型文章,那么 16.7 带来的 Hooks 就要像文学经典一样反复研读. Hoo ... 
