为什么有 _ViewStart 和 _ViewImports?为什么不是一个文件?

Ham*_*ian 12 c# razor asp.net-core-mvc asp.net-core

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

@{
    const string SomeConstant = "some value";
}
Run Code Online (Sandbox Code Playgroud)

类似地,_ViewImports.cshtml在文件夹内具有确切名称的文件可以包含要在该文件夹中的 razor 视图/页面之间共享的所有常见 razor 指令。像这样:

@layout _Layout
@using MyApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Run Code Online (Sandbox Code Playgroud)

但这里有一个我无法用谷歌搜索的问题,无论我如何改写:

有人可以向我解释为什么我们有 a_ViewStart.cshtml和 a_ViewImports.cshtml来定义通用代码和指令吗?为什么不在单个文件中定义这些功能(似乎并不相互冲突)?

Sha*_*uti 12

_ViewStart 文件

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

例如,ViewStart 的常见做法是为LayoutViewData / ViewBag字典设置一个可以覆盖的默认值。

_ViewImports 文件

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

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

因为 using 指令的作用域是当前视图文件的主体。因此,将 @using 语句放入 ViewStart 文件中不会使它们可用于除 viewStart 文件本身之外的任何其他视图文件。因此,出现了特殊的 ViewImports 文件,该文件旨在为 @using 语句和其他有用的东西提供此范围扩展目的,例如标签助手,如果没有这个特殊文件,它将在每个违反DRY 的视图文件中重复(不要重复自己)原则