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
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.