Как получить всех пользователей в роли с помощью метода GetUsersInRoleAsync и отобразить его в виде, указанном ниже, в реализации .net Core MVC

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

#c# #asp.сетевое ядро #.net-ядро #asp.net-ядро-mvc #asp.net-идентификация

Вопрос:

Этот пост будет немного длинным, так что, пожалуйста, потерпите меня. Пожалуйста, не стесняйтесь обращаться за разъяснениями, если это необходимо. Ниже я опубликую свою текущую реализацию, которая отлично работает, но я нашел встроенную функцию GetUsersInRoleAsync. Я хотел бы знать, как я могу изменить свой контроллер, модель и представление ниже, чтобы

  1. Получение ролей пользователей с помощью метода GetUsersInRoleAsync
  2. Затем извлеките эти данные в моем представлении

Текущая Реализация Кода.

Модель

 using System.ComponentModel.DataAnnotations;  namespace MyApp.Models.ViewModels {  public class RoleViewModel  {  public RoleViewModel()  {  Users = new Listlt;stringgt;();  }  public string? Id { get; set; }   [Required]  [Display(Name = "Role Name")]  public string Name { get; set; } = default!;   public Listlt;stringgt;? Users { get; set; }   } }  

Контроллер

 [HttpGet] public async Tasklt;IActionResultgt; Read(string? id) {  var role = await roleManager.FindByIdAsync(id);  if (role == null)  {  TempData[Helper.ErrorMessage] = "Role not found";  return View("NotFound");  }  var model = new RoleViewModel  {  Id = role.Id,  Name = role.Name  };  foreach (var user in userManager.Users)  {  if (await userManager.IsInRoleAsync(user, role.Name))  {  model.Users?.Add(user.UserName);  }  }  return View(model); }  

Вид

 @model MyApp.Models.RoleViewModel  lt;form method="get" asp-action="Read"gt;  lt;div class="row g-3"gt;  lt;div class="form-group col-sm-6"gt;  lt;label asp-for="Name" class="form-label"gt;lt;/labelgt;  lt;input asp-for="Name" class="form-control" type="text" disabled readonlygt;  lt;/divgt;  lt;/divgt;  lt;div class="card mt-5"gt;  lt;div class="card-header"gt;  lt;ul class="nav nav-tabs card-header-tabs"gt;  lt;li class="nav-item"gt;  lt;a class="nav-link active" aria-current="true"gt;Userslt;/agt;  lt;/ligt;  lt;/ulgt;  lt;/divgt;  lt;div class="card-body"gt;  lt;h5 class="card-title"gt;Userslt;/h5gt;  lt;p class="card-text"gt;List of users in this Rolelt;/pgt;  lt;div class = "my-3"gt;  @if (Model?.Users?.Countgt;0)  {  foreach (var user in Model.Users)  {  lt;li class="card-title"gt;@userlt;/ligt;  }  }  else  {  lt;partial name="_NoData" /gt;  }  lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;partial name="_FooterMenuRead" /gt; lt;/formgt;  

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

1. привет, метод GetUsersInRoleAsync возвращает список пользователей из хранилища пользователей, которые являются членами указанного имени роли. Вы хотите отобразить всех пользователей в этой роли?

2. Да, именно так. GetUsersInRoleAsync возвращает данные в виде типа IListlt;IdentityUsergt;. Я не могу вернуть значения в представление без преобразования списка IList в список. Поскольку моя модель-это список пользователей.

3. Так что какой вред, если вы преобразуете IListlt;IdentityUsergt; в Список. (используя a для каждого цикла или напрямую используя linq)

4. @AvanthaSiriwardana Не могли бы вы уточнить решение. Я не знаю,как преобразовать IList в список, используя Linq. Было бы лучше, если бы вы могли помочь, изменив мой код выше.

5. Что — то вроде этого: var usersInRole = await _userManager.GetUsersInRoleAsync("Your Role Name"); foreach (var user in usersInRole) { // add value to your list }

Ответ №1:

вы можете изменить свой контроллер следующим образом:

 [HttpGet]  public async Tasklt;IActionResultgt; Read(string? id)  {    var role = await roleManager.FindByIdAsync(id);  if (role == null)  {  TempData[Helper.ErrorMessage] = "Role not found";  return View("NotFound");  }  var model = new RoleViewModel  {  Id = role.Id,  Name = role.Name  };    foreach (var user in await userManager.GetUsersInRoleAsync(role.Name))  {  model.Users?.Add(user.UserName);  }  return View(model);  }  

Ответ №2:

Лучший способ, который я нашел, чтобы сделать это без каких-либо циклов, — это изменить контроллер следующим образом:

 [HttpGet] public async Tasklt;IActionResultgt; Read(string? id) {  var role = await roleManager.FindByIdAsync(id);  if (role == null)  {  TempData[Helper.ErrorMessage] = "Role not found";  return View("NotFound");  }  var userList = await userManager.GetUsersInRoleAsync(role.Name);  RoleViewModel? model = new()  {  Id = role.Id,  Name = role.Name,  Users = userList  };  return View(model); }  

Код в поле зрения остается таким же, как и в вопросе