一、前言

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
摘抄自:https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc-view-layout-section.html
如有侵权请告知

ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门的更多相关文章

  1. ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

  2. ASP.NET Core 入门笔记6,ASP.NET Core MVC 视图传值入门

    摘抄自:https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc-view-renderdata.html 如有侵权请告知 一.前言 1.本教 ...

  3. ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MV ...

  4. git入门笔记汇总——(廖雪峰博客git入门)

    本文内容是对廖雪峰老师Git教程做的笔记,外加一些自己的学习心得,还抱着学以致用的心态来实践一番 如有显示错误 请移步本人github:git教程小结 Git学习笔记 Git简介 安装Git 创建版本 ...

  5. oracle 入门笔记--v$sql和v$sqlarea视图(转载)

    转载于作者:dbtan 原文链接:http://www.dbtan.com/2009/12/vsql-and-vsqlarea-view.html v$sql和v$sqlarea视图: 上文提到,v$ ...

  6. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  7. ASP.NET Core 入门笔记8,ASP.NET Core MVC 分部视图入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...

  8. ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

  9. ASP.NET Core 入门笔记3,使用ASP.NET Core MVC框架构建Web应用

    一.ASP.NET Core MVC 输出Hello World,Friend! 1.引入 ASP.NET Core MVC 修改应用启动类(Startup.cs),引入MVC模块并配置默认路由 pu ...

随机推荐

  1. iOS native plugin 的代码sample

    https://bitbucket.org/Unity-Technologies/iosnativecodesamples/src/stable/ 不在这个stable版本 在2017 dev这个版本

  2. hybird(h5)页面自动化测试

  3. 如何自己实现一个HTMLRunner

    在使用unittest框架时,我们常常需要下载一个HTMLRunnerCN.py用来生成HTML格式的报告,那么我们能不能自己实现一个呢? HTMLRunner是模仿unittest自带的TextTe ...

  4. BZOJ1005--[HNOI2008]明明的烦恼(树的prufer编码)

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5768  Solved: 2253[Submit][Stat ...

  5. POJ 1236 Network of Schools —— (缩点的应用)

    题目大意:有N个学校和一些有向边将它们连结,求: 1.最少需要向几个学校发放软件,使得他们中的每一个学校最终都能够获得软件. 2.最少需要增加几条有向边使得可以从任意一个学校发放软件,使得每一个学校最 ...

  6. jquery ajax缓存问题解决方法小结

    今天在做一个ajax数据提交功能开始利用get方式一直发现提交的数据都是一样,返回的数据也很久不刷新了,这个我知道是ajax缓存问题,后来在网上整理了一些ajax缓存问题解决方法,下面给大家分享一下. ...

  7. js 中null,undefined区别

    首先摘自阮一峰先生的文章: 大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil. 有点奇 ...

  8. LightGBM新特性总结

    LightGBM提出两种新方法:Gradient-based One-Side Sampling (GOSS) 和Exclusive Feature Bundling (EFB)(基于梯度的one-s ...

  9. Netty使用(一)

    1.Netty介绍 Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架: 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器 ...

  10. qt 元对象系统

    元对象系统 Qt中的元对象系统是用来处理对象间通讯的信号/槽机制.运行时的类型信息和 动态属性系统. 它基于下列三类: QObject类: 类声明中的私有段中的Q_OBJECT宏: 元对象编译器(mo ...