为什么同时拥有_ViewStart和_ViewImports?为什么没有一个文件?

时间:2018-12-02 15:14:29

标签: c# razor asp.net-core asp.net-core-mvc

在ASP.NET Core MVC中,我们可以将确切名称为_ViewStart.cshtml的文件放在文件夹中,以包含要在该文件夹中的每个剃刀视图/页面之前运行的通用C#代码。像这样:

@{
    const string SomeConstant = "some value";
}

类似地,文件夹中名称为_ViewImports.cshtml的文件可以包含该文件夹中所有剃须刀视图/页面之间共享的所有通用剃须刀指令。像这样:

@layout _Layout
@using MyApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

但是无论我如何改写,这都是我无法用谷歌搜索的问题:

有人可以向我解释为什么我们同时拥有_ViewStart.cshtml_ViewImports.cshtml来定义通用代码和指令吗?为什么没有在单个文件中定义这些功能(似乎彼此之间没有冲突)?

3 个答案:

答案 0 :(得分:2)

_ViewStart文件

它用于在所有视图文件中设置共享内存(公共静态变量)。

例如,ViewStart的常规做法是设置一个默认值,您可以为 Layout ViewData / ViewBag 字典。

_ViewImports文件

在此文件中,您可以汇总(抽象)所有在所有视图中常用的语句。

为什么要将_ViewImports文件用于常见的“使用指令”而不是ViewStart?

因为使用指令具有当前视图文件主体的范围。因此,将@using语句放入ViewStart文件中不会使它们可用于除viewStart文件本身之外的其他任何视图文件。因此,出现了特殊的ViewImports文件,该文件旨在满足@using语句的作用域扩展目的,以及其他有用的功能,例如标记帮助器,如果没有此特殊文件,它将在每个违反{{ 3}}。

答案 1 :(得分:1)

在其他答案中被忽视的一件事是,根据 official documentation

  • _ViewStart.cshtml 文件中的代码将用于非布局页面。
  • _ViewImports.cshtml 文件中的代码将针对布局和非布局页面运行。

我已经通过将默认的 Application Insights JavaScript 片段(下面的代码)从导入文件移动到启动文件来对此进行测试,这会导致我的布局页面上出现构建错误,因为它无法再找到定义的变量 {{ 1}}。

我移动的代码:

JavaScriptSnippet

鉴于此,文件之间的区别可能是“我想在任何地方运行的代码”与“我只想为完整视图运行的代码”,类似于 @inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet .bashrc 之间的区别.

答案 2 :(得分:0)

应在每个页面上放置_ViewStart.cshtml文件之前需要执行的代码。

对于_ViewImport.cshtml-此文件的内容应用于同一文件夹和子文件夹中存在的所有文件。

因此_ViewStart是执行程序,而_ViewImport将其内容应用于每个文件。

TEST1 _ViewStart 处放置“布局[更正]”引用和“ using语句[不正确]”都将导致编译器错误。

TEST2 _ViewImport 处放置“布局[InCorrect]”引用和“ using语句[正确]”都不会将_Layout应用于其他页面

根据MSDN ViewImport支持以下说明

@ addTagHelper,@ removeTagHelper:全部按顺序运行。

@tagHelperPrefix:距离视图最近的位置会覆盖其他任何位置

@model:最接近视图的模型会覆盖其他模型

@inherits:最接近视图的视图会覆盖其他视图

@using:全部包含在内;重复项被忽略

@inject:对于每个属性,最接近视图的属性都会覆盖具有相同属性名称的其他任何属性