#c# #asp.net-core #.net-core #asp.net-core-mvc #asp.net-identity
#c# #asp.сетевое ядро #.net-ядро #asp.net-ядро-mvc #asp.net-идентификация
Вопрос:
Этот пост будет немного длинным, так что, пожалуйста, потерпите меня. Пожалуйста, не стесняйтесь обращаться за разъяснениями, если это необходимо. Ниже я опубликую свою текущую реализацию, которая отлично работает, но я нашел встроенную функцию GetUsersInRoleAsync. Я хотел бы знать, как я могу изменить свой контроллер, модель и представление ниже, чтобы
- Получение ролей пользователей с помощью метода GetUsersInRoleAsync
- Затем извлеките эти данные в моем представлении
Текущая Реализация Кода.
Модель
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); }
Код в поле зрения остается таким же, как и в вопросе