原文:ASP.NET Core Razor 视图起始页 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET Core Razor 视图起始页

上一章节中我们介绍了布局视图,和使用布局视图改造了我们的 Index.html 页面,这已经非常节省我们的精力了,也大大提高了心情的愉悦程度。好是好了,可能能不能一省到底,把那个 @{ Layout } 也变的只写一次就好了呢?

对吧,这样就可以很轻松的了,答案同样是肯定的,可以。

我们可以使用启动视图来完成这个工作,视图起始页,顾名思义,就是 Razor 视图引擎每次渲染视图前,就会先加载的视图

本章节,我们将学习 Razor 视图起始页 ( View Start )。

视图起始页 _ViewStart.cshtml

MVC 中的 Razor 视图引擎有一个约定,就是在渲染单个控制器视图前,会优先查找名称为 _ViewStart.cshtml 的文件,并执行该文件中的代码

于是,Razor 视图引擎的渲染流程就变成了下图这样

当然了,_ViewStart.cshtml 也不是万能的,就是它不能包含任何 HTML 标记,但可用于从各个视图内的代码块中删除重复的代码

这也是遵守单一职责原则,输出 HTML 代码的工作都交给了布局视图和普通视图去搞定

在我们的 HelloWorld 项目中,我们希望每个视图都使用上一章节我们创建的布局视图 _Layout.html,而不是每个视图中都要手动加载它,像这种情况,我们就可以使用启动视图来解决

范例

我们举一个简单的例子来描述下启动视图时如何工作的

我们将在 Views 目录下新建一个启动视图 _ViewStart.cshtml,然后输入加载布局视图的公共代码

  1. 右键点击 View 目录,选择 添加 -> 新建文件 打开新建文件对话框

    如果你的电脑是 Windows 系统,则是选择 添加 -> 新建项

  2. 选中左边的 ASP.NET Core,然后从中间选中 MVC 视图起始页

    如果你的电脑是 Windows 系统,则是先选中 ASP.NET Core -> Web -> ASP.NET ,然后从中间选择 Razor View Start

  3. 在名称中输入 _ViewStart_ViewStart.cshtml ( Windows ),然后点击右下角的 新建添加 ( Windows )

创建完成后的目录结果如下

_ViewStart.cshtml 中默认的内容如下

@{
Layout = "_Layout";
}

我们先删除 Index.html 中的 Layout,删除完成后,Index.cshtml 中的内容如下

@model HelloWorld.Controllers.HomePageViewModel
@{
ViewBag.Title = "Home 控制器下的 Index 方法";
}
<h1>欢迎!</h1>
<div>这个消息来自 Home 控制器下的 Index 的视图文件 index.cshtml </div>
<table>
@foreach (var employee in Model.Employees)
{
<tr>
<td><a href="/Home/Detail/@employee.ID">@employee.ID</a></td>
<td>@employee.Name</td>
</tr>
}
</table>

刷新浏览器,可以看到输出结果如下

为了演示 _ViewStart.cshtml 的作用,我们清空 _ViewStart.cshtml 中的内容,改成如下

 

刷新浏览器,可以看到输出结果如下

哈哈,_ViewStart.cshtml 起作用了

我们先把 _ViewStart.cshtml 的内容恢复成默认的。

_ViewStart.cshtml 的运行机制

  1. 当 MVC 框架中的 Razor 开始渲染视图前,它会递归检查文件夹结构层次中是否存在 ViewStart 文件

  2. 我们已将 _ViewStart 直接放入了 Views 文件夹中。这将影响 Views 文件夹内的所有文件夹中的所有视图以及 Home 文件夹内的视图以及 Shared 文件夹以及将来可能添加的其它任何控制器文件夹

  3. 如果我们使用 ViewStart 并将其 放置在 Home 文件夹中,那么只有在 Home 文件夹中的视图被渲染时才会执行这一小段代码

  4. 我们甚至可以拥有多个 ViewStart 文件,因此我们可以在 Views 文件夹中的 ViewStart.cshtml 中设置所有视图的布局视图

  5. 如果我们想要改变 Home 文件夹中所有视图的默认设置,可以在 Home 文件夹中设置另一个 ViewStart,将布局设置为其它内容

区别

那么下面两个内容有区别吗?

Layout = "_Layout";

Layout = "~/Views/Shared/_Layout.cshtml";

答案是有,当然如果只有一个 _Layout.cshtml 的情况下,就没有区别

  1. 前者的搜索范围比后者更广,可以在 Views 目录也可以在 Views/Shared 目录
  2. 前者的文件扩展名可以随意,但后者只能是 .cshtml

ASP.NET Core Razor 视图起始页 - ASP.NET Core 基础教程 - 简单教程,简单编程的更多相关文章

  1. ASP.NET Core Razor 视图导入 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 视图导入 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 视图导入 上一章节我们介绍了视图起始页,学习 ...

  2. ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 标签助手 上一章节我们介绍了视图导入,学习了 ...

  3. Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html

    Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...

  4. ASP.NET Core Razor 视图组件

    视图组件简介 在新的ASP.NET Core MVC中,视图组件类似于局部视图,但它们更强大.视图组件不使用模型绑定,仅依赖于您在调用时提供的数据. 视图组件特性: 呈现页面响应的某一部分而不是整个响 ...

  5. Razor 视图引擎 – ASP.NET MVC 4 系列

           Razor 视图引擎是 ASP.NET MVC 3 开始扩展的内容,并且也是默认视图引擎.        Razor 通过理解标记的结构来实现代码和标记之间尽可能顺畅的转换.下面的例子演 ...

  6. ASP.NET MVC Razor视图引擎攻略

    --引子 看下面一段MVC 2.0的代码. <%if (Model != null){%> <p><%=Model%></p><%}%>&l ...

  7. ASP.NET Mvc Razor视图语法

    在ASP.NET MVC中有两套模版引擎,一套是ASPX,一套是Razor,从事过WebForms开发的朋友们,对于ASPX模版已经很熟悉了,下面我说一下我所熟悉的Razor模版引擎的一些语法,供大家 ...

  8. ASP.NET MVC3 Razor视图引擎-基础语法

    I:ASP.NET MVC3在Visual Studio 2010中的变化 在VS2010中新建一个MVC3项目可以看出与以往的MVC2发生了很明显的变化. 1.ASP.NET MVC3必要的运行环境 ...

  9. MvcMailer通过ASP.NET MVC Razor视图和基架发送邮件

    MvcMailer是一个有趣的组件,您可以使用ASP.NET MVC框架在发送邮件.很重要的是,它使用Razor视图引擎的观点作为电子邮件模板和很容易安装和使用.在本文中你将看到如何安装,设置邮件模板 ...

随机推荐

  1. [TypeStyle] Reusable styles using TypeStyle mixins

    TypeStyle’s style function allows you to give multiple objects as an argument. This provides a simpl ...

  2. php 下载图片到服务器

    function saveImage($path) { if(!preg_match('/\/([^\/]+\.[a-z]{3,4})$/i',$path,$matches)) die('Use im ...

  3. js 鼠标坐标

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. php模拟post提交文件图片等

    <?php /** * Email net.webjoy@gmail.com * author jackluo * 2014.11.21 * */ //* function curl_post( ...

  5. 【76.57%】【codeforces 721A】One-dimensional Japanese Crossword

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. 【物理/数学】概念的理解 —— pivot、position

    0. 基本释义 pivot: n. 枢轴:中心点:旋转运动 vt. 以-为中心旋转:把-置于枢轴上 vi. 在枢轴上转动:随-转移 adj. 枢轴的:关键的 position: n. 位置,方位:职位 ...

  7. keepalived小结

    keepalived 启动流程: 启动三个进程(主进程.healthcheck 进程.vrrp进程)之后,先进入backup状态,运行一次vrrp_script成功后发现没有主,这时候会进入maste ...

  8. iOS 项目的文件夹结构能看出你的开发经验

    近期有师弟去面试iOS开发,他谈论到,面试官既然问他怎么分文件夹结构的,并且还详细问到每一个子文件夹的文件名称. 文件夹结构确实非常重要.面试官问他这些无疑是想窥探他的开发经验.清晰的文件夹结构,可让 ...

  9. 视频播放MPMoviePlayerController

    视频播放 如何播放视频 iOS提供了MPMoviePlayerController.MPMoviePlayerViewController两个类,可以用来轻松播放视频和网络流媒体\网络音频 提示:网络 ...

  10. python 多线程拷贝单个文件

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/04 下午 12:25 # 多线程方式拷贝单个文件 import threading ...