在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
来定义通用代码和指令吗?为什么没有在单个文件中定义这些功能(似乎彼此之间没有冲突)?
答案 0 :(得分:2)
_ViewStart文件
它用于在所有视图文件中设置共享内存(公共静态变量)。
例如,ViewStart的常规做法是设置一个默认值,您可以为 Layout 和 ViewData / ViewBag 字典。
_ViewImports文件
在此文件中,您可以汇总(抽象)所有在所有视图中常用的语句。
为什么要将_ViewImports文件用于常见的“使用指令”而不是ViewStart?
因为使用指令具有当前视图文件主体的范围。因此,将@using语句放入ViewStart文件中不会使它们可用于除viewStart文件本身之外的其他任何视图文件。因此,出现了特殊的ViewImports文件,该文件旨在满足@using语句的作用域扩展目的,以及其他有用的功能,例如标记帮助器,如果没有此特殊文件,它将在每个违反{{ 3}}。
答案 1 :(得分:1)
在其他答案中被忽视的一件事是,根据 official documentation:
我已经通过将默认的 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:对于每个属性,最接近视图的属性都会覆盖具有相同属性名称的其他任何属性