Razor _ViewImports.cshtml文件中@using
和@namespace
指令的作用是什么?
@using TagHelpersBuiltIn
@namespace TagHelpersBuiltIn.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
答案 0 :(得分:3)
ASP.NET Core MVC中的_ViewImports.cshtml
文件负责提供可由其他视图(即共享命名空间)使用或访问的命名空间。
@using TagHelpersBuiltIn
标记包含TagHelpersBuiltIn
父命名空间(即与项目名称相同)。
@namespace TagHelpersBuiltIn.Pages
意味着在所有视图中声明名称空间TagHelpersBuiltIn.Pages
,这样可以启用cshtml.cs
文件(example)中声明的模型类。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
指令使Microsoft.AspNetCore.Mvc.TagHelpers
库内容可供所有视图使用,标记辅助语法如<label asp-for="Model.PropertyName"></label>
可用于视图页。
参考文献:
答案 1 :(得分:3)
什么是_ViewImports.cshtml`?
_ViewImports.cshtml
用于声明驻留在包含_ViewImports.cshtml
文件的文件夹中的视图的所有导入。它还用于为驻留在该文件夹中的所有视图声明名称空间,此外,还声明应该对驻留在该文件夹中的视图可用的任何标记助手。
<强> @namespace 强>
@namespace
文件中的_ViewImports.cshtml
指令用于声明Razor Views / Pages的根命名空间。大多数项目的默认生成_ViewImports.cshtml
文件将为@namespace MyProjectName.Pages
。在_ViewImports.cshtml
文件中只应该有一个这样的声明,如果有多个,最后一个是“赢”的,其余的将没有效果。 @namespace
指令类似于声明C#类文件的命名空间。这只允许为文件夹中的所有视图声明命名空间,而不必在每个视图中声明命名空间。
<强> @using 强>
@using
用于为文件夹中的所有视图添加导入。例如:如果您的_ViewImports.cshtml
文件包含@using Microsoft.AspNetCore.Identity
,则该文件夹下的所有视图都可以访问Microsoft.AspNetCore.Identity
命名空间的成员,而无需通过@using
显式导入它们指令。
<强> @addTagHelper 强>
@addTagHelper
用于声明应该对包含_ViewImports.cshtml
文件的文件夹中的视图可用的所有标记帮助程序。默认项目模板通常在根@addTagHelper
文件中包含以下_ViewImports.cshtml
指令:@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
。
其他信息
应该注意,_ViewImports.cshtml
或Views
根目录中的Pages
文件将应用于Views
或Pages
的所有子目录文件夹也是。您还可以在子目录中添加_ViewImports.cshtml
文件,以添加仅应用于该子目录中的视图的其他using语句。值得注意的是,至少对于Razor Pages,即使根_ViewImports.cshtml
文件将命名空间声明为@namespace MyProject.Pages
,MyProject\Pages\ASubDirectory
中的视图也会自动被赋予命名空间{{1}无需添加另一个MyProject.Pages.ASubDirectory
文件,在_ViewImports.cshtml
内声明命名空间。
<强>归因强>
这个答案最初是编辑Yoshi的答案。因此,部分答案是基于编码Yoshi的答案。
答案 2 :(得分:0)
您在 ViewImports.cshtml 文件中使用@namespace
提及的任何名称空间都可以自动使用您的视图(.cshtml文件),而无需使用@using
。换句话说,它们将隐式。如果 ViewImports.cshtml 文件中未提及,您仍需要使用@using
。
设计了@namespace指令,以便将C#类添加到项目中,并且页面生成的代码可以正常工作,而无需为代码隐藏文件添加@using指令。
换句话说,如果您将@namespace
添加到 _ViewImports.cshtml 文件中,那么其他文件就不需要在每个文件中使用@using
。
什么是_ViewImports.cshtml`?
来自docs:
_ViewImports.cshtml有一个主要目的:提供可供所有其他视图使用的命名空间。在以前的MVC项目中,此功能由Views文件夹中的web.config文件提供;由于web.config不再存在,因此该文件现在提供了全局命名空间。
更多解释
在MVC5及更早版本中,如果您检查 Views / web.config 文件,您会注意到xml,其中您会注意到这个或更多<add
个元素:
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="Mvc" />
</namespaces>
这基本上是指示Razor引擎,此特定 Views 文件夹中的所有 .cshtml 文件都需要这些名称空间,因此需要 .cshtml 对于这些名称空间,em>文件可以使用没有@using
的名称空间。在MVC6中, Views / web.config 不再存在,并且由 ViewImports.cshtml 文件替换,该文件具有相同的用途。
好的,那么什么是@using呢?
.cshtml 文件中仍然需要@using
,因为 ViewImports.cshtml 文件中未使用@namespace
导入任何名称空间。例如,如果您有一个名为 Edit.cshtml 的视图,那么您可能会这样:
@using NamespaceA;
这意味着明确导入此命名空间以供 Edit.cshmtl 文件使用。 ViewImport.cshtml 文件中提到的一些其他命名空间将自动提供给 Edit.cshtml 文件。
答案 3 :(得分:0)
在Razor _ViewImports.cshtml文件中,@using和@namespace指令有什么作用?
@namespace
为每个*.cshtml
文件提供一个适应其目录的命名空间 @using
授予每个*.cshtml
文件访问其命名空间之外的类型的权限.cshtml
文件都受到影响一个namespace
创建一个范围。在范围内,类型名称必须唯一。
在名称空间中,文件具有对名称空间中所有类型的非限定访问权限。从名称空间外部,文件只能使用名称空间限定的全名(或使用using
指令)访问这些类型。
存在命名空间以防止命名冲突:两种类型可以具有相同的名称,只要这些名称位于不同的命名空间中即可。
示例:
namespace Computers {
// the name Apple must be unique within its namespace
// from outside its namespace it is Computers.Apple
public class Apple {}
}
namespace Garden {
public class Apple {
// we access Apple from another namespace via its full name
public void UseComputer(Computers.Apple appleComputer) { }
}
}
使用类型的全名可能很不方便。当不存在命名冲突时,using
指令提供了一种方便的方法来从另一个名称空间访问类型-不必限定类型名称。
using Computers;
namespace TechnologyStore {
// `using Computer` lets us access Apple without qualifying it
public class SellComputer(Apple appleComputer) { }
}
@namespace
在* .cshtml文件中如何工作?*。cshtml文件也具有名称空间和类型。我们可以看到,如果将以下代码放入“剃刀页面”或“视图”中。
@using
// Pages/Index.cshtml
@page
<p>@this.GetType().Namespace</p> // AspNetCore
<p>@this.GetType().Name</p> // Pages_Index
// Pages/Foo/Index.cshtml
@page
<p>@this.GetType().Namespace</p> // AspNetCore
<p>@this.GetType().Name</p> // Pages_Foo_Index
文件的默认命名空间为*.cshtml
。 @model位于某些自定义命名空间中时,这很麻烦。如果AspNetCore
在@model
中,那么我们必须做一些工作才能访问它:
MyCustomNamespace
那不是太多的工作;但是如果我们使命名空间与目录结构保持一致,并且如果我们移动// Pages/Index.cshtml
@page
@namespace MyCustomNamespace
@model IndexModel
<p>@this.GetType().Namespace</p> // MyCustomNamespace
<p>@this.GetType().Name</p> // Pages_Index
文件,那么我们将需要更新*.cshtml
语句。
@namespace
现在// Pages/Foo/Index.cshtml
@page
@namespace MyCustomNamespace.Foo
@model IndexModel
<p>@this.GetType().Namespace</p> // MyCustomNamespace.Foo
<p>@this.GetType().Name</p> // Pages_Foo_Index
文件具有与其*.cshtml
相同的名称空间,从而可以访问它。
在上面的示例中,要获得对@model
的访问权限,我们可以使用@model
指令而不是@using
指令。
@namespace
在_ViewImports.cshtml文件中如何工作?在重新组织目录结构时,每个文件都具有@namespace
或@namespace
会造成维护问题。当我们将@using
放入index.cshtml
目录时,它的Foo
不会自动更改-我们需要记住手动更改它。如果我们使用代码分析工具来保持我们的@namespace
名称空间与其目录保持一致,那将是一个问题。
这是*.cs
中@namespace
变得方便的地方。它将* .cshtml文件名称空间自动与其目录对齐。
_ViewImports
不仅每个文件都获得一个名称空间,而且每个名称空间均适应其文件目录。
我们可以在https://github.com/aspnet/Razor/issues/1159
处了解// Pages/_ViewImports
@namespace MyCustomNamespace
// Pages/Index.cshtml
@page
<p>@this.GetType().Namespace</p> // MyCustomNamespace
<p>@this.GetType().Name</p> // Pages_Index
// Pages/Foo/Index.cshtml
@page
<p>@this.GetType().Namespace</p> // MyCustomNamespace.Foo <- adapts to the directory
<p>@this.GetType().Name</p> // Pages_Foo_Index
存在的原理。