2016-10-26 16 views
1

В проекте C# (ASP.NET Core) после входа в систему сайт должен отобразить меню с подменю в соответствии с разрешениями пользователя. Это меню отображается на всех сайтах. В основном это меню панели инструментов.Получить текущего пользователя в TagHelper

Содержание этого меню (подменю) динамически, согласно разрешению пользователя. Итак, я думаю, что при создании класса TagHelper, который получает текущего зарегистрированного пользователя, получите контент, который у этого пользователя имеет разрешение, и создайте содержимое подменю (somes <ul> и <li>).

Я не знаю, подходит ли это лучший подход. Я принимаю предложения.

Но если этот подход подходит для использования, как я могу получить текущего зарегистрированного пользователя в классе TagHelper? У меня нет HttpContext на этом классе, только TagHelperContext.

TagHelper:

public class UserContentTagHelper : TagHelper 
{ 
    private readonly UserManager<ApplicationUser> _userManager; 

    public UserContentTagHelper(UserManager<ApplicationUser> userManager) 
    { 
     _userManager = userManager; 
    } 

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
    { 
     output.TagMode == TagMode.SelfClosing; 

     // Error. HttpContext.User not avaliable 
     var uid = _userManager.GetUserId(HttpContext.User); 
    } 
} 

Обычно, чтобы получить текущий пользователь, я использую HttpContext.User, но это уже доступно только на классе контроллера.

Спасибо!

ответ

4

Добавить параметр IActionContextAccessor в ваш конструктор. После этого вы можете получить HttpContext и связанного с ним пользователя с:

var user = actionAccessor.ActionContext.HttpContext.User; 
var uid = _userManager.GetUserId(user); 

Вам также необходимо зарегистрироваться в вашей ConfigureServices в IActionContextAccessor метод класса запуска:

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>(); 
+1

работал! нужно только настроить DI IActionContextAccessor ('services.AddSingleton ();') и, возможно, это опечатка, но uid должен быть 'var uid = _userManager.GetUserId (user);' –

+0

Хорошая точка, обновленная ответ –