Я делаю это, чтобы получить роли пользователя:

var roles = await _userManager.GetRolesAsync(user);

После этого простой цикл может служить такой цели:

foreach(var r in roles)
{
  if (r.Name == "School")
  {
  }
} 

Теперь я застрял в знании, каким должно быть свойство объекта r. Можете ли вы ответить на этот самый простой вопрос?

2
Jay 8 Окт 2018 в 12:58

2 ответа

Лучший ответ

{{ X0}} возвращает Task<IList<String>>. В вашем примере вы используете await, что означает, что ваша переменная roles становится типа IList<String>. При итерации через roles с вашим оператором foreach каждое значение r в цикле просто имеет тип String. Очевидно, что String не содержит свойства с именем Name, и поэтому ошибка имеет смысл.

Похоже, вы ожидали, что r будет представлять сложный тип (возможно, IdentityRole), но поскольку здесь это просто строка, вы можете просто сравнить r напрямую, например:

foreach(var r in roles)
{
    if (r == "School")
    {

    }
} 
1
Kirk Larkin 9 Окт 2018 в 12:16

Когда вы получаете object из Role с помощью Identity, у вас есть список объектов со многими свойствами, например: User, Id, Name, NormalizeName , и что-то вроде этого. Вы можете их отследить и увидеть.

Вы должны знать, чего хотите.

Если вы хотите проверить userRoles с помощью системы Roles, вы можете написать такой код:

var roles = await _roleManager.Roles.TolistAsync();
var userRolesName = await _userManagment.GetRolesAsync(user);

Сейчас! у вас есть список ролей, которые есть у пользователя, и у вас есть все роли. и с помощью этого кода вы получаете объект ролей, которые есть у пользователя:

var userRoles = userRolesName.Where(x=>userRolesName.Contain(x.Name));

С помощью этого кода у вас есть объект ролей, которые есть у пользователя, и вы можете их обрабатывать.

0
meagar 17 Окт 2018 в 15:02