#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. Зарегистрирована строка’. Есть идея?