Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么_ViewStart和_viewsimports都有?为什么不是一个文件?_C#_Razor_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 为什么_ViewStart和_viewsimports都有?为什么不是一个文件?

C# 为什么_ViewStart和_viewsimports都有?为什么不是一个文件?,c#,razor,asp.net-core,asp.net-core-mvc,C#,Razor,Asp.net Core,Asp.net Core Mvc,在ASP.NET Core MVC中,我们可以将一个确切名称为\u ViewStart.cshtml的文件放在一个文件夹中,以包含要在该文件夹中的每个razor视图/页面之前运行的公共C代码。大概是这样的: @{ const string SomeConstant = "some value"; } 类似地,文件夹中具有确切名称\u ViewImports.cshtml的文件可以保存该文件夹中razor视图/页面之间共享的所有公共razor指令。像这样: @layout _Layout

在ASP.NET Core MVC中,我们可以将一个确切名称为
\u ViewStart.cshtml
的文件放在一个文件夹中,以包含要在该文件夹中的每个razor视图/页面之前运行的公共C代码。大概是这样的:

@{
    const string SomeConstant = "some value";
}
类似地,文件夹中具有确切名称
\u ViewImports.cshtml
的文件可以保存该文件夹中razor视图/页面之间共享的所有公共razor指令。像这样:

@layout _Layout
@using MyApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
但有一个问题我无法用谷歌来回答,不管我怎么说:


有人能告诉我为什么我们有一个
\u ViewStart.cshtml
和一个
\u viewsimports.cshtml
来定义通用代码和指令吗?为什么这些功能(似乎彼此不冲突)不在单个文件中定义?

查看开始文件

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

例如,ViewStart的常见做法是设置一个默认值,您可以为布局和ViewData/ViewBag字典覆盖该值

视图导入文件

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

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


因为使用指令具有当前视图文件主体的范围。因此,将@using语句放在ViewStart文件中不会使它们可用于除ViewStart文件本身主体之外的任何其他视图文件。因此,出现了特殊的ViewImports文件,该文件旨在为@using语句和其他有用的东西(例如标记帮助器)的范围扩展服务,没有此特殊文件,将在每个视图文件中重复,这违反了在放置每个页面之前需要执行的代码_ViewStart.cshtml文件

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

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

TEST1 将“Layout[Correct]”引用和“using statement[Correct]”放在\u ViewStart会导致编译器错误

TEST2 将“布局[不正确]”引用和“使用语句[更正[/strong>]”放在\u ViewImport将不会将布局应用于其他页面

根据ViewImport支持以下指令

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

@tagHelperPrefix:与视图最近的一个将覆盖任何其他视图

@模型:与视图最近的模型将替代任何其他模型

@继承:与视图最近的一个将覆盖任何其他视图

@使用:全部包括在内;重复项被忽略


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

  • _ViewStart.cshtml文件中的代码将仅对非布局页面运行
  • _ViewImports.cshtml文件中的代码将针对布局和非布局页面运行
我已经通过将默认的Application Insights JavaScript片段(下面的代码)从导入文件移动到开始文件进行了测试,它在我的布局页面上导致生成错误,因为它无法再找到定义的变量
JavaScriptSnippet

我移动的代码:

@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet

考虑到这一点,文件之间的区别可能是“我想在任何地方运行的代码”与“我只想在完整视图下运行的代码”,类似于
.bashrc
.bash\u profile

之间的区别,因为有一个称为关注点分离的原则。ViewImports关心导入,ViewStart关心页面/视图所需的逻辑,但其余视图关心指令、逻辑和标记…仅当您愿意时。您可以在单个文件中完成所有操作,包括布局。你做什么取决于你“只要你愿意”?我很抱歉,但你的评论似乎包含了比有效论点更多的屈尊俯就。。。请告诉我:我如何在我的其他.cshtml文件中坚持这个“分离关注点的原则”(你显然刚刚教过我这个原则)?你最后一次看到一个真正的razor页面没有包含指令+标记+一些c#all-in-one文件是什么时候?这难道不是MVC堆栈中引入“剃须刀页面”的原因吗?对于引起愤怒的反弹,我很抱歉……Razor Pages是另一个试图引起PHP用户兴趣的失败尝试,或者微软说,我不会碰它。我有一些应用程序,其中视图仅用于加载HTML和javascript,其他应用程序仅用于加载Angular,其他应用程序则包含HTML和Razor。因此,你是说
\u ViewImports
是解决
\u ViewStart
中的范围问题的一种方法?我们可能希望在
\u ViewStart
中放置
@using
语句(仅用于
\u ViewStart
中的逻辑),而不将它们级联到整个文件夹中?好的,谢谢你给出了一个看似合理的答案,但对我来说,这听起来与DRY完全相反:为什么我想要
\u ViewStart
中的
@using
语句,而不是共享逻辑的其余文件?为什么我需要再次使用语句编写相同的
,才能在其他文件中访问它?@HamidSadeghian,谢谢你的评论,我同意。但是,当前的DRY原则是这样应用的:_ViewStart会干燥视图的主体,而_viewsimports会干燥视图的directives部分。_ViewStart是公共主体,_ViewImports是指令的公共头。在我看来,这样没关系,因为