如何使用 GetUsersInRoleAsync 方法检索角色中的所有用户,并按照 .net Core MVC 中的以下实现将其显示在视图中

How to retrieve all users in role using GetUsersInRoleAsync Method and display it the view as per below implementation in .net Core MVC

这篇post会有点长,请耐心等待。如果需要,请不要犹豫,要求澄清。我将在下面 post 我当前的实现,它运行良好,但我发现了内置函数 GetUsersInRoleAsync。我想知道如何将下面的控制器、模型和视图修改为

  1. 使用 GetUsersInRoleAsync 方法获取用户角色
  2. 然后在我的视图中检索这些详细信息

当前代码实现。

型号

using System.ComponentModel.DataAnnotations;

namespace MyApp.Models.ViewModels
{
    public class RoleViewModel
    {
        public RoleViewModel()
        {
            Users = new List<string>();
        }
        public string? Id { get; set; }

        [Required]
        [Display(Name = "Role Name")]
        public string Name { get; set; } = default!;

        public List<string>? Users { get; set; }

    }
}

控制器

[HttpGet]
public async Task<IActionResult> 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

<form method="get" asp-action="Read">
    <div class="row g-3">
        <div class="form-group col-sm-6">
            <label asp-for="Name" class="form-label"></label>
            <input asp-for="Name" class="form-control" type="text" disabled readonly>
        </div>
    </div>
    <div class="card mt-5">
        <div class="card-header">
            <ul class="nav nav-tabs card-header-tabs">
                <li class="nav-item">
                    <a class="nav-link active" aria-current="true">Users</a>
                </li>
            </ul>
        </div>
        <div class="card-body">
            <h5 class="card-title">Users</h5>
            <p class="card-text">List of users in this Role</p>
            <div class = "my-3">
            @if (Model?.Users?.Count>0)
            {
                foreach (var user in Model.Users)
                {
                    <li class="card-title">@user</li>
                }
            }
            else
            {
                <partial name="_NoData" />
            }
            </div>
        </div>
    </div>
    <partial name="_FooterMenuRead" />
</form>

您可以这样更改您的控制器:

            [HttpGet]
            public async Task<IActionResult> 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);
            }

我发现没有任何循环的最佳方法是按如下方式修改控制器:

[HttpGet]
public async Task<IActionResult> 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);
}

视图中的代码与问题中的代码保持一致