в чем разница между директивами @using и @namespace?

#asp.net-core #razor-pages

#asp.net-ядро #razor-страницы

Вопрос:

Я новичок в asp.net страница бритвы, извините, если мой вопрос звучит глупо.

Мне кажется, что оба @using и @namespace делают одно и то же, что позволяет вам не использовать полное имя, указанное в пространстве имен? so @using и @namespace взаимозаменяемы?

Ответ №1:

Нет, они не делают то же самое.

От https://www.learnrazorpages.com/razor-pages/files/viewimports:

@namespace Директива определяет корневое пространство имен, которое будет использоваться страницами (и их моделями). По соглашению, он состоит из разделенного точками пути к местоположению страницы Razor с именем приложения, указанным в качестве «корня». Наличие @namespace объявления в файле ViewImports избавляет вас от необходимости полностью указывать имена моделей в @model директиве отдельных страниц.

У вас может быть только одна @namespace директива для каждого файла ViewImports. Добавление нескольких @namespace директив в один и тот же файл приведет к ошибкам сборки.

Вы можете добавить дополнительные @using директивы, чтобы включить дополнительные пространства имен в область видимости:

 @using MyApplication
@using MyApplication.Models
@using MyApplication.Services
@namespace MyApplication.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
 

Комментарии:

1. @Mikr Приношу благодарность за ваш ответ, но все еще в замешательстве. В приведенном выше примере я тоже могу использовать @using MyApplication.Pages , не так ли?

2. Да, вы можете, но вам это не нужно. Страницы уже находятся в этом пространстве имен, поэтому вам не нужно использовать @using , чтобы избежать необходимости использовать полное пространство имен, например @model , в директивах. Но ты можешь, если захочешь.

3. если @namespace MyApplication.Pages можно заменить на @using MyApplication.Pages , то разве эти две вещи не одинаковы?

4. Нет. Они не делают одного и того же. @namespace Директива задает пространство имен для страниц содержимого. @using Директива этого не делает. Это позволяет сокращенно ссылаться на классы и т.д. в других пространствах имен.

5. извините, что снова беспокою вас. Просто хочу подтвердить, что вы имеете в виду, что страница Razor может иметь свое собственное пространство имен? Я всегда думал, что только файл класса (.cs) может иметь пространство имен, так .cshtml может ли оно также иметь пространство имен? но разве код, стоящий за файлом страницы razor, уже не имеет пространства имен, например, index.cshtml.cs может определять свое собственное пространство, и, похоже @namespace , используется для установки пространства index.cshtml имен, чтобы оно соответствовало его коду за пространством имен файла index.cshtml.cs ?