Использование httpContextAccessor в представлении через _ViewImports (ядро. net) - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу использовать зарегистрированную информацию пользователей во всех видах. У меня есть пользовательский класс 'CustomUserSM' для сериализации / десериализации как заявки.

public class CustomUserSM
    {
        public bool Authenticated = false;
        public string Username { get; set; }
        public string Name { get; set; }
        public byte userCountryId { get; set; }
        public int userCityId { get; set; }
        etc..
    }

Я добавил ниже строки в _ViewImports

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor
@inherits ProjectName.Auth.BaseView<TModel>

Класс BaseView здесь;

public abstract class BaseView<TModel> : RazorPage<TModel>
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        public readonly CustomUserSM UserInfo;
        public BaseView(IHttpContextAccessor httpContextAccessor) 
        {
            _httpContextAccessor = httpContextAccessor;
            if (_httpContextAccessor != null)
            {
                if (_httpContextAccessor.HttpContext.User.Claims.Any(c => c.Type == "Info"))
                {
                    UserInfo = JsonConvert.DeserializeObject<CustomUserSM>(_httpContextAccessor.HttpContext.User.Claims.First(c => c.Type == "Info").Value);
                }
            }
        }
    }

эта строка уже добавлена ​​в Startup.cs

services.AddHttpContextAccessor();

.. и я получаю эту ошибку;

There is no argument given that corresponds to the required formal parameter 'httpContextAccessor' of 'BaseView<dynamic>.BaseView(IHttpContextAccessor)'

Чего мне не хватает? Заранее спасибо.

1 Ответ

0 голосов
/ 19 апреля 2020

Я добавляю этот ответ для таких новичков, как я, чтобы попробовать внедрение зависимостей в классе BasePage, который наследуется от RazorPage. Мне было интересно, что используется httpContext в BasePage (наследуется от RazorPage) и что-то внедряется в BasePage.

Вы можете [RazorInject] атрибут, чтобы ввести некоторые свойства.

[RazorInject]
public IHttpContextAccessor _httpContext { get; set; }

Конечно, вы должны связать его в Startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddHttpContextAccessor();
            etc..
         }

Выше приведен только пример, чтобы увидеть, как использовать Это. Вам не нужно вводить IHttpContextAccessor для доступа к контексту http, потому что в RazorPage уже есть public HttpContext Context { get; }.

...