用户和角色放入一个表中 asp.net mvc

本文关键字:一个 asp mvc net 角色 用户 | 更新日期: 2023-09-27 18:31:57

我让这个东西工作,但是我想采取不同的方法,因为当用户只有一个角色时,表格缺少行。我在网站上有 3 个角色:用户、超级用户和管理员。

这是我的控制器:

 public ActionResult UserList()
 {
    var userRoles = new List<RolesViewModel>();
    var context = new ApplicationDbContext();
    var userStore = new UserStore<ApplicationUser>(context);
    var userManager = new UserManager<ApplicationUser>(userStore);

    foreach (var user in userStore.Users)
    {
        var r = new RolesViewModel
        {
            UserName = user.UserName
        };
        userRoles.Add(r);
    }
    foreach (var user in userRoles)
    {
        user.RoleNames = userManager.GetRoles(userStore.Users.First(s => s.UserName == user.UserName).Id);
    }
    return View(userRoles);
}

这是我的角色视图模型:

public class RolesViewModel
{
    public IEnumerable<string> RoleNames { get; set; }
    public string UserName { get; set; }
}

和观点:

<table class="table table-hover">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.UserName)
        </th>
        <th>
            Role 1
        </th>
        <th>
            Role 2
        </th>
        <th>
            Role 3
        </th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.UserName)
            </td>
            @foreach (var role in item.RoleNames)
            {               
                <td>
                    @Html.DisplayFor(modelItem => role)
                </td>
            }
        </tr>
    }
</table>

因此,在我获得角色 1 角色 2 和角色 3 的表中,我希望用户超级用户和管理员为每个用户提供一个模型,但我无法真正让它工作,我如何以最佳方式完成此操作?

用户和角色放入一个表中 asp.net mvc

我知道

您期望三个特定角色,但您的模型将来可能会包含更多角色。在这方面,你的介绍不是很有前瞻性。此外,这种结构分解的方式太多了,无法简洁地回答。相反,我建议你重构你的网格和视图模型以适应。

稍微更改视图模型:

public class RolesViewModel
{
    public string RoleNames { get; set; }
    public string UserName { get; set; }
}

接下来,结合提高数据访问效率并修订 Roles 属性值的构造方式:

public ActionResult UserList() {
    var userRoles = new List<RolesViewModel>();
    var context = new ApplicationDbContext();
    var userStore = new UserStore<ApplicationUser>(context);
    var userManager = new UserManager<ApplicationUser>(userStore);

    foreach (var user in userStore.Users)
    {
        var r = new RolesViewModel()
        {
            UserName = user.UserName,
            RoleNames = string.Join(",", userManager.GetRoles(user.Id))
        };
        userRoles.Add(r);
    }
    return View(userRoles); 
}

最后简化网格:

<table class="table table-hover">
<tr>
    <th>
        User Name
    </th>
    <th>
        Roles
    </th>
</tr>
@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(m => item.UserName)
        </td>
        <td>
            @Html.DisplayFor(m => item.RoleNames)
        </td>
    </tr>
}
</table>

最后,如果您必须坚持使用此结构,以下是至少使用复选框样式设置的相同演示文稿:

public class RolesViewModel
{
    public string UserName { get; set; }
    public bool UserRole { get; set; }
    public bool SuperUserRole { get; set; }
    public bool AdminRole { get; set; }
}
public ActionResult UserList()
{
    var userRoles = new List<RolesViewModel>();
    var context = new ApplicationDbContext();
    var userStore = new UserStore<ApplicationUser>(context);
    var userManager = new UserManager<ApplicationUser>(userStore);

    foreach (var user in userStore.Users)
    {
        var roles = userManager.GetRoles(user.Id);
        var r = new RolesViewModel()
        {
            UserName = user.UserName,
            UserRole = roles.Contains("User"),
            SuperUserRole = roles.Contains("SuperUser"),
            AdminRole = roles.Contains("Admin")
        };
        userRoles.Add(r);
    }
    return View(userRoles);
}
    }
}
<table class="table table-hover">
<tr>
    <th>
        User Name
    </th>
    <th>
        User
    </th>
    <th>
        Super User
    </th>
    <th>
        Admin
    </th>
</tr>
@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(m => item.UserName)
        </td>
        <td>
            @Html.CheckBoxFor(m => item.UserRole)
        </td>
        <td>
            @Html.CheckBoxFor(m => item.SuperUserRole)
        </td>
        <td>
            @Html.CheckBoxFor(m => item.AdminRole)
        </td>
    </tr>
}
</table>

作为记录,我意识到这个控制器在如何通过为每个唯一用户的一系列数据存储往返来获取每个用户角色方面有点丑陋。如果这甚至被使用,我会把它留给 OP 清理......