原文: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. 使用XX-Net永久访问真正的互联网

    XX-Net基于GoAgent(代理软件),使用谷歌App Engine(GAE)代理服务器通过防火墙,是github上的一个开源项目. https://github.com/XX-net/XX-Ne ...

  2. https://www.cyberciti.biz/faq/howto-change-rename-user-name-id/

    https://www.cyberciti.biz/faq/howto-change-rename-user-name-id/

  3. C# datatable增加行(datarow)数据为另一个datatable中某行

    两个表A和B,两表结构相同.现在需要将A表中部分行拷贝到B表中,直接用 DataTableB.rows.add(dataTableA.rows[0]) 这样的方法式会报"row已经属于A表& ...

  4. 前端js实现打印excel表格

    产品原型: 图片.png 功能需求:点击导出考勤表格按钮,会自动下载成Excel格式 图片.png 图片.png jsp页面代码: <div class="tools"> ...

  5. Redis tomcat

    http://blog.csdn.net/fu9958/article/details/17325563 http://my.oschina.net/kolbe/blog/618167 http:// ...

  6. js课程 1-4 js变量的作用域是怎样的

    js课程  1-4   js变量的作用域是怎样的 一.总结 一句话总结:只有在函数内部前面带var的变量为局部变量,局部变量只能在函数体内使用. 1.什么情况下会出现NaN类型的错误,举一例? Num ...

  7. Android 面试之横竖屏切换的Activity生命周期

    public class EngineerJspActivity extends Activity { private static String Tag = "EngineerJspAct ...

  8. 小强的HTML5移动开发之路(33)—— jqMobi基础

    一.什么是jqMobi jqMobi是由appMobi针对HTML5浏览器和移动设备开发的javascript框架,是个极快速的查询选择库,支持W3C查询. 版本 jqMobi源码最初在2012年1月 ...

  9. Expression Blend 的点滴(4)--创建类似iPhone屏幕锁控件(下)

    原文:Expression Blend 的点滴(4)--创建类似iPhone屏幕锁控件(下) 接着上篇... 接下去,将一步步演示如果创建当点击checkBox后,其中的按钮由左边滑动到右边,表示处于 ...

  10. 【b501】谁拿了最多的奖学金

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同:1) 院士奖学金 ...