@using和@namespace指令在Razor _ViewImports.cshtml文件中做了什么?

时间:2018-05-14 01:29:00

标签: asp.net asp.net-mvc razor-pages

Razor _ViewImports.cshtml文件中@using@namespace指令的作用是什么?

@using TagHelpersBuiltIn @namespace TagHelpersBuiltIn.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

_ViewImports.cshtml

4 个答案:

答案 0 :(得分:3)

ASP.NET Core MVC中的_ViewImports.cshtml文件负责提供可由其他视图(即共享命名空间)使用或访问的命名空间。

  • @using TagHelpersBuiltIn标记包含TagHelpersBuiltIn父命名空间(即与项目名称相同)。

  • @namespace TagHelpersBuiltIn.Pages意味着在所有视图中声明名称空间TagHelpersBuiltIn.Pages,这样可以启用cshtml.cs文件(example)中声明的模型类。

    < / LI>
  • @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers指令使Microsoft.AspNetCore.Mvc.TagHelpers库内容可供所有视图使用,标记辅助语法如<label asp-for="Model.PropertyName"></label>可用于视图页。

参考文献:

Tag Helpers in ASP.NET Core

The ViewImports File

答案 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.cshtmlViews根目录中的Pages文件将应用于ViewsPages的所有子目录文件夹也是。您还可以在子目录中添加_ViewImports.cshtml文件,以添加仅应用于该子目录中的视图的其他using语句。值得注意的是,至少对于Razor Pages,即使根_ViewImports.cshtml文件将命名空间声明为@namespace MyProject.PagesMyProject\Pages\ASubDirectory中的视图也会自动被赋予命名空间{{1}无需添加另一个MyProject.Pages.ASubDirectory文件,在_ViewImports.cshtml内声明命名空间。

<强>归因

这个答案最初是编辑Yoshi的答案。因此,部分答案是基于编码Yoshi的答案。

答案 2 :(得分:0)

您在 ViewImports.cshtml 文件中使用@namespace提及的任何名称空间都可以自动使用您的视图(.cshtml文件),而无需使用@using。换句话说,它们将隐式。如果 ViewImports.cshtml 文件中未提及,您仍需要使用@using

来自documentation

  

设计了@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 文件可以使用没有@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文件访问其命名空间之外的类型的权限
  • _ViewImport的目录和子目录中的所有.cshtml文件都受到影响

什么是C#名称空间?

  • 一个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) { }
    } 
}

什么是C#using指令?

使用类型的全名可能很不方便。当不存在命名冲突时,using指令提供了一种方便的方法来从另一个名称空间访问类型-不必限定类型名称。

using Computers;

namespace TechnologyStore {
    // `using Computer` lets us access Apple without qualifying it
    public class SellComputer(Apple appleComputer) { }
}

{。{1}}和@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 存在的原理。