Определить глобальную переменную в _ViewStart.cshtml

#c# #asp.net-core-mvc

#c# #asp.net-core-mvc #asp.net-core-3.1

Вопрос:

Мы используем .NET Core 3.1 . Мы хотим определить глобальную переменную (адрес электронной почты текущего пользователя) в _ViewStart.cshtml , чтобы все другие представления могли получить к ней доступ. Делая это, мы стремимся избежать повторяющегося кода.

Следующий код:

 @using System.Security.Claims
Your email: @User.FindFirstValue(MyClaimTypes.Email)
  

может быть заменено только этим:

 Your email: @email
  

Я попытался определить электронную почту в _ViewStart.cshtml вот так:

 @{
    Layout = "_MyLayout";
    string email = "test@test.com";
}
  

и позже получить к ней доступ в Index.cshtml :

 Your email: @email
  

Но там говорится, что

Имя ’email’ не существует в текущем контексте.

Как мы можем получить доступ к переменной, определенной в _ViewStart.cshtml , из всех других представлений?

Ответ №1:

В _ViewImports.cshtml вы можете ввести переменную следующим образом:

 @using MyApp.AspNetCore
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

@{ 
    string UserEmail = "test@test.com";
}
@inject string UserEmail;
  

В Index.cshtml вы можете ссылаться на нее по ее имени:

 <span>Hello @UserEmail </span>
  

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

1. Спасибо. Что, если у нас есть более одного _ViewImports.cshtml файла в нашем решении? Должны ли мы копировать-вставлять этот код в каждый из них или есть способ каким-то образом извлечь это в одну общую функцию?

2. Обычно у вас не должно быть более одной _ViewImports.cshtml для каждого приложения (возможно, только если вы используете области). Но вы не должны слишком сильно использовать «повторно используемый» код. Иметь ее во множестве _ViewImports все равно лучше, чем иметь ее в каждом Index.cshtml . Также, точно так же, как вы ввели @inject string UserEmail , вы можете ввести вспомогательные классы, которые уменьшат количество дубликатов

3. Да, мы используем области, и каждая область имеет свою собственную _ViewImports.cshtml . Спасибо за предложение относительно вспомогательных классов.

4. @Catalin Я использовал ваш код, но получил ошибку типа: «String.string не зарегистрирован в контейнере» что мне делать?

5. @Catalin Я получил ошибку -> Нет сервиса для типа ‘System. Зарегистрирована строка’. Есть идея?