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

Posted

技术标签:

【中文标题】如何使用 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 【发布时间】:2022-01-13 05:15:24 【问题描述】:

这篇文章会有点长,请多多包涵。如果需要,请随时要求澄清。我将在下面发布我当前的实现,它运行良好,但我找到了内置函数 GetUsersInRoleAsync。我想知道如何将下面的控制器、模型和视图修改为

    使用 GetUsersInRoleAsync 方法获取用户角色 然后在我的视图中检索那些细节

当前代码实现。

型号

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>

【问题讨论】:

嗨,GetUsersInRoleAsync 方法返回用户存储中属于指定角色名称成员的用户列表。是否要显示该角色的所有用户? 是的。 GetUsersInRoleAsync 以 IList 的类型返回数据。我无法在不将 IList 转换为 List 的情况下将值返回到视图。因为我的模型是用户列表。 那么如果将 IList 转换为 List 会有什么危害。 (使用 for each 循环或直接使用 linq) @AvanthaSiriwardana 您能否澄清一下解决方案。我不知道如何使用 Linq 从 IList 转换为 List。如果你能通过修改我上面的代码来提供帮助会更好。 类似这样的东西:var usersInRole = await _userManager.GetUsersInRoleAsync("Your Role Name"); foreach (var user in usersInRole) // add value to your list 【参考方案1】:

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

            [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);
            

【讨论】:

【参考方案2】:

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

[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);

视图中的代码与问题中的代码相同

【讨论】:

以上是关于如何使用 GetUsersInRoleAsync 方法检索角色中的所有用户并按照以下 .net Core MVC 中的实现将其显示在视图中的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?