ASP.NET Core 2.0 : 四. _Layout与_ViewStart

时间:2021-03-13 01:24:45

本章我们新建一个项目,并通过这个项目熟悉一下_Layout与_ViewStart以及它们的加载顺序.

ASP.NET Core 系列目录

新建一个项目

首先, 文件->新建一个解决方案

ASP.NET Core 2.0 : 四.  _Layout与_ViewStart

选择.Net Core 的APP下面的ASP.NET Core Web App(MVC)

Next

ASP.NET Core 2.0 : 四.  _Layout与_ViewStart

设置解决方案的名称(和Xcode的界面风格有点像), 输入FL.WeightManager, 做一个每天记录体重的应用

点击Create.

项目新建完毕, 项目的文件结构上一章已经说过了.

_layout的应用

新建好的项目默认运行效果如下图

ASP.NET Core 2.0 : 四.  _Layout与_ViewStart

页面主要分三部分, 上面的header, 下面的footer, 点击上面菜单总的Home、About和Contact切换一下页面看一下

这两部分都是不变的, 只有中间部分在变.

打开Shared文件夹下面的_layout.cshtml页面看一下, header和footer都是定义在这里的,

而中间变的部分是 @RenderBody().也就是我们经常要改变的地方了.

现在将主页改变一下, 打开Home文件夹下的Index文件,将里面的一大堆代码改成如下代码

 @{
ViewData["Title"] = "主页";
}
<table class="table table-hover">
<thead>
<tr>
<th>序号</th>
<th>日期</th>
<th>体重</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>--</td>
<td>66.6</td>
<td>除夕,胖了</td>
</tr>
<tr>
<td></td>
<td>--</td>
<td>68.8</td>
<td>春节,又重了</td>
</tr>
</tbody>
</table> 

刷新一下页面

ASP.NET Core 2.0 : 四.  _Layout与_ViewStart

看起来效果还不错, 可能会注意到, 这个table有个class  <table class="table table-hover"> ,

这个class定义在哪里呢.

再次打开_layout文件, 可以看到里面在Development环境下引用了bootstrap的css

    <environment include="Development">
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>

所以可以把一些"通用"的css和js的引用放在layout文件里, 避免重复写这些引用.

顺便把header和footer中显示的项目名称改一下, 然后分别打开Index和About这些页面, Header和Footer都统一改变了.

如下图的About页面.

ASP.NET Core 2.0 : 四.  _Layout与_ViewStart

但是我们在这个Index页中没有对这个模板做引用, 是通过什么方式引用的呢?

_ViewStart的应用

回顾修改后的Index页面, 我们并没有写 Layout = "_Layout" 这样的代码, 这是因为已经在_ViewStart中默认设置了

_ViewStart中只有这一句

@{
Layout = "_Layout";
}

如果我们在Index页面中添加一句 Layout=null 如下,

@{
Layout=null;
ViewData["Title"] = "主页";
}

再次刷新页面, 样子变成了这样

ASP.NET Core 2.0 : 四.  _Layout与_ViewStart

Header和Footer以及Table的样式全都没有了, 是因为这些本来都写在_Layout中, 现在失去了对_Layout的引用, 这些也就消失了.

总结: _ViewStart对模板页做了默认的设置, 除非显示的写明Layout=XXX, 否则会采用_ViewStart中的设置.

所以未做设置和设置 Layout = "_Layout" 的效果是一样的.

_ViewStart、_Layout和Index(实际页面)的加载顺序

加载顺序是: _ViewStart =>Index=>_Layout.

1._ViewStart在所有View加载之前加载, 设置了默认的模板页.

2.接着由Controller指定的页面查找Index.cshtml加载, 并读取该页面的Layout设置.

3.根据Index页面的Layout设置的模板页查找对应的模板页加载.

将_ViewStart中的 Layout = "_Layout" 改为 Layout = "_Layout1" , 再次运行, 页面会出现如下找不到模板的错误.

An unhandled exception occurred while processing the request.

InvalidOperationException: The layout view '_Layout1' could not be located. The following locations were searched:
/Views/Home/_Layout1.cshtml
/Views/Shared/_Layout1.cshtml
Microsoft.AspNetCore.Mvc.Razor.RazorView.GetLayoutPage(ViewContext context, string executingFilePath, string layoutPath)

View的查找规则: 先查找Controller对应的文件夹(这里是Home), 若未找到则到Shared文件夹查找, 若最终未找到则提示错误.

ASP.NET Core 系列目录

ASP.NET Core 2.0 : 四. _Layout与_ViewStart的更多相关文章

  1. ASP&period;NET Core 2&period;0 &colon; 系列目录

    目录: ASP.NET Core 2.0 : 一. 概述 ASP.NET Core 2.0: 二. 开发环境 ASP.NET Core 2.0 : 三. 项目结构 ASP.NET Core 2.0 : ...

  2. Asp&period;net core 2&period;0&period;1 Razor 的使用学习笔记(四)

    ASP.net core 2.0.1 中 asp.net identity 2.0.1 的基本使用(三)—用户注册 一.修改用户注册 1.打开Pages文件夹>Account>Regist ...

  3. 探索ASP&period;Net Core 3&period;0系列四:在ASP&period;NET Core 3&period;0的应用中启动时运行异步任务

    前言:在本文中,我将介绍ASP.NET Core 3.0 WebHost的微小更改如何使使用IHostedService在应用程序启动时更轻松地运行异步任务. 翻译 :Andrew Lock   ht ...

  4. &period;NET跨平台之旅:将示例站点升级至ASP&period;NET Core 1&period;0

    北京时间6月28日凌晨,微软发布了 .NET Core 1.0,详见新闻 .NET Core 1.0 正式发布了 ,ASP.NET Core 1.0 也随之一起发布了. 紧跟这次发布,我们将跑在 Li ...

  5. 初识ASP&period;NET Core 1&period;0

    本文将对微软下一代ASP.NET框架做个概括性介绍,方便大家进一步熟悉该框架. 在介绍ASP.NET Core 1.0之前有必要澄清一些产品名称及版本号.ASP.NET Core1.0是微软下一代AS ...

  6. 跨平台运行ASP&period;NET Core 1&period;0

    前言 首先提一下微软更名后的叫法: ASP.NET 5 更名为 ASP.NET Core 1.0 .NET Core 更名为 .NET Core 1.0 Entity Framework 7 更名为  ...

  7. ASP&period;NET Core 1&period;0开发Web API程序

    .NET Core版本:1.0.0-rc2Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2开发及运行平台:Windows ...

  8. 跨平台运行ASP&period;NET Core 1&period;0(转载)

    前言 首先提一下微软更名后的叫法: ASP.NET 5 更名为 ASP.NET Core 1.0 .NET Core 更名为 .NET Core 1.0 Entity Framework 7 更名为  ...

  9. ASP&period;NET CORE 2&period;0 不小心踩得坑

    前言 我是跟着 https://github.com/FQLin/Docs 学习asp.net core 2.0 的 1.EF迁移 EF 的迁移方式有两种: Command-line interfac ...

随机推荐

  1. Redis学习笔记&lpar;2&rpar;-String

    package cn.com; import java.util.List; import redis.clients.jedis.Jedis; public class Redis_String { ...

  2. 各种不会。。。。编译和安装hadoop过程中好多命令和工具不会

    http://blog.csdn.net/bamuta/article/details/13506893  64位下解决方法(重新编译~~) http://zhidao.baidu.com/link? ...

  3. Python Tutorial 学习&lpar;三&rpar;--An Informal Introduction to Python

    3.1. 将Python用作计算器 3.1.1. Numbers 数 作为一个计算器,python支持简单的操作, '+','-','*','/'地球人都知道的加减乘除. ()可以用来改变优先级,同数 ...

  4. 浅谈MVC模式

    MVC模式(三层架构模式) (Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  5. Python小知识点(5)--面向对象部分

    面向对象: 世间万物,皆可分类.--------------------手机<--------------某一个分类 世间万物,皆为对象.--------------------我的手机< ...

  6. js开发模式

    js中的开发模式进化史: js中有最初的只能由基本数据类型描述——>单例模式-->工厂模式-->构造函数模式-->原型模式-->各个模式相结合的混合模式,下面我会给大家逐 ...

  7. 【连载6】二手电商APP的导购功能与关系链机制分析

    导读:得益于十余年来各种一手电商平台对市场与用户的教育以及共享.分享经济浪潮的兴起,互联网化的二手.闲置商品买卖.置换成为越来越普遍且简单可实现的生活方式. 第三章目录: 三.对比:主流二手电商竞品的 ...

  8. Java中的13个原子操作类

    java.util.concurrent.atomic包一共提供了13个类.属于4种类型的原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新属性.Atomic包里的类基本都是使 ...

  9. 剑指Offer——和为S的两个数字

    题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的.   输入描述: 对应每个测试案例,输出两个数,小的先输出. ...

  10. Rabbimq必备基础之对高级消息队列协议AMQP分析及Rabbitmq本质介绍

    MQ的一个产品... [消息队列] 1. MSMQ windows自带的一个服务... [petshop],message存放在文件系统中. 最原始的消息队列... [集群,消息确认,内存化,高可用, ...