Что делают директивы @using и @namespace в файле Razor _ViewImports.cshtml? - PullRequest
0 голосов
/ 14 мая 2018

Что делают директивы @using и @namespace в файле Razor _ViewImports.cshtml?

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

_ViewImports.cshtml

Ответы [ 4 ]

0 голосов
/ 17 августа 2018

Что делают директивы @using и @namespace в файле Razor _ViewImports.cshtml?

Вот краткая версия:

  • @namespace дает каждому *.cshtml файлу пространство имен, которое адаптируется к его каталогу
  • @using предоставляет каждому *.cshtml файлу доступ к типам, которые находятся вне его пространства имен
  • все файлы .cshtml в каталоге и подкаталогах _ViewImport затронуты

Что такое пространство имен C #?

  • A namespace создает область. Внутри области имена типов должны быть уникальными.

  • Изнутри пространства имен файлы имеют безусловный доступ ко всем типам в пространстве имен. Из-за пределов пространства имен файлы могут получать доступ только к тем типам с полным именем, полным пространства имен (или с помощью директивы using).

  • Существуют пространства имен для предотвращения конфликтов имен: два типа могут иметь одно и то же имя, если эти имена находятся в разных пространствах имен.

* +1039 * Пример:
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) { }
}

Как @namespace и @using работают в * .cshtml файле?

Файл * .cshtml также имеет пространство имен и тип. Мы можем увидеть это, если перетащим следующий код в Razor Page или View.

// 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 является AspNetCore. Это проблема, когда @model находится в каком-то пользовательском пространстве имен. Если @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.

Как @namespace работает в файле _ViewImports.cshtml?

Наличие @namespace или @using для каждого файла создает проблему обслуживания, когда мы реорганизуем нашу структуру каталогов. Когда мы помещаем index.cshtml в каталог Foo, его @namespace не меняется автоматически - нам нужно было помнить, чтобы изменить его вручную. Это может быть проблемой, если мы используем инструменты анализа кода, чтобы наши пространства имен *.cs были выровнены с их каталогами.

Здесь @namespace в _ViewImports становится удобным. Он автоматически выравнивает пространства имен файлов * .cshtml с их каталогами.

// 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

Мало того, что каждый файл получает пространство имен, но каждое пространство имен адаптируется к каталогу его файла .

Смотри также

Мы можем прочитать об обосновании существования @namespace здесь: https://github.com/aspnet/Razor/issues/1159

0 голосов
/ 14 мая 2018

Файл _ViewImports.cshtml в ASP.NET Core MVC отвечает за предоставление пространств имен, которые могут использоваться или использоваться другими представлениями (т.е. общими пространствами имен).

  • @using TagHelpersBuiltIn отметки включены TagHelpersBuiltIn родительское пространство имен (т.е. то же самое, что и имя проекта).

  • @namespace TagHelpersBuiltIn.Pages подразумевает объявление пространства имен TagHelpersBuiltIn.Pages во всех представлениях, что позволяет использовать классы моделей, объявленные в файле cshtml.cs ( пример ).

  • @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers включает Microsoft.AspNetCore.Mvc.TagHelpers содержимое библиотеки будет доступно для всех представлений, причем такой синтаксис тега, как <label asp-for="Model.PropertyName"></label>, можно использовать на страницах просмотра.

Ссылки:

Помощники тегов в ASP.NET Core

Файл ViewImports

0 голосов
/ 18 июня 2018

Что такое _ViewImports.cshtml`?

_ViewImports.cshtml используется для объявления всего импорта для представлений, находящихся в папке, содержащей файл _ViewImports.cshtml.Он также используется для объявления пространства имен для всех представлений, находящихся в этой папке, и, кроме того, для объявления любых помощников тегов, которые должны быть доступны для представлений, находящихся в этой папке.

@ namespace

Директива @namespace в файле _ViewImports.cshtml используется для объявления корневого пространства имен для ваших Razor Views / Pages.Сгенерированный по умолчанию файл _ViewImports.cshtml для большинства проектов будет иметь @namespace MyProjectName.Pages.В вашем файле _ViewImports.cshtml должно быть только одно из этих объявлений, и, если их несколько, последним будет тот, который «победит», а остальные не будут иметь никакого эффекта.Директива @namespace аналогична объявлению пространства имен для файла класса C #.Это просто позволяет объявлять пространство имен для всех представлений в папке, вместо того, чтобы объявлять пространство имен в каждом представлении.

@ с использованием

@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 в свои подкаталоги, чтобы добавить дополнительные операторы использования, которые должны применяться только к представлениям в этом подкаталоге.Также стоит отметить, что, по крайней мере для Razor Pages, даже если корневой файл _ViewImports.cshtml объявляет пространство имен как @namespace MyProject.Pages, представлению в MyProject\Pages\ASubDirectory автоматически будет присвоено пространство имен MyProject.Pages.ASubDirectory без добавления другого файла _ViewImports.cshtmlобъявление пространства имен в пределах MyProject\Pages\ASubDirectory.

Атрибуция

Этот ответ первоначально был редактированием ответа Кодирования Йоши.Таким образом, часть ответа основана на кодировании ответа Йоши.

0 голосов
/ 14 мая 2018

Какие бы пространства имен вы не указали при использовании @namespace в файле ViewImports.cshtml , они будут доступны для ваших представлений (файлы .cshtml) автоматически без использования @using.Другими словами, они будут доступны неявно .Если это не указано в файле ViewImports.cshtml , вам все равно потребуется использовать @using.

Из документации

.Директива @namespace была разработана таким образом, чтобы классы C #, добавленные в проект, и сгенерированный страницами код работали без необходимости добавлять директиву @using для кода, стоящего за файлом.

Другими словами, если вы добавите@namespace в файл _ViewImports.cshtml , тогда другим файлам не нужно будет использовать @using в каждом из них.

Что такое _ViewImports.cshtml`?

Из документов :

_ViewImports.cshtml обслуживает один основнойЦель: предоставить пространства имен, которые могут использоваться всеми другими представлениями.В предыдущих проектах MVC эта функциональность обеспечивалась файлом web.config в папке Views;поскольку файл 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,что все файлы .cshtml в этой конкретной папке Views будут нуждаться в этих пространствах имен, и поэтому файлы .cshtml могут использовать эти пространства имен без @using для этих пространств имен,В MVC6 Views / web.config больше не существует, и он заменяется файлом ViewImports.cshtml , который служит той же цели.

Ok greatТак что же значит @using для?

Вам по-прежнему понадобятся @using в файлах .cshtml для любых пространств имен, которые не импортируются с использованием @namespace в ViewImports.cshtml file.Например, если у вас есть представление с именем Edit.cshtml , то у вас может быть это:

@using NamespaceA;

Это означает, что это пространство имен импортировано явно, чтобы быть доступным для Редактировать.файл cshmtl .Несколько других пространств имен, упомянутых в файле ViewImport.cshtml , будут автоматически доступны для файла Edit.cshtml .

...