为用户角色创建下拉列表

本文关键字:下拉列表 创建 角色 用户 | 更新日期: 2023-09-27 18:12:40

我想达到的目标

如果一个用户是3个角色的成员,我想生成3个DropDownLists的所有角色和每个要选择的用户角色。我不想使用ViewBag。

问题

目前,我可以生成3个包含所有角色的DropDownLists,但是没有选择用户所属的3个角色。如果用户是Admin、PowerUser和Manager角色的成员,则在所有3个下拉列表中只选择最后一个角色Manager。

问题

我如何用正确选择的角色生成所需的下拉列表?

视图模型

public class UserViewModel
{
    public IEnumerable<SelectListItem> RolesList { get; set; }
    public string RolesListId { get; set; }
}
控制器

// Get list of roles that user is a member of
var userRoles = UserManager.GetRoles(user.Id);
var model = new UserViewModel()
{
    RolesList = RoleManager.Roles.ToList().Select(r => new SelectListItem
    {
        Selected = userRoles.Contains(r.Name),
        Text = r.Name,
        Value = r.Name
    }).OrderBy(r => r.Text),
};
视图

@for (int i = 0; i < Model.RolesList.Where(x => x.Selected == true).Count(); i++)
{
    @Html.DropDownListFor(model => model.RolesListId, Model.RolesList, "Select Role ...")
}

为用户角色创建下拉列表

这是您需要的代码,但是当用户可以有多个角色时,与其使用DropDownList,不如使用CheckBoxes列表。

  • 用户和角色之间存在(n到n)的关系,下拉列表无法表示这种关系。
  • 如果使用多个下拉列表,用户可以从列表1中选择角色1,然后从列表2中选择角色1,再从列表3中选择角色1。
  • 如果您使用下拉列表,最终用户如何添加一个角色给用户?

无论如何,这里是您需要的DropDownList代码:

@foreach (var item in Model.RolesList.Where(x => x.Selected))
{
    @Html.DropDownList("SelectedRole", new SelectList(Model.RolesList, "Value", "Text", item.Value), "Select a Role")
}

如果你决定使用复选框:

@foreach (var item in (SelectList)ViewBag.RoleId)
{
    <input type="checkbox" name="SelectedRoles" value="@item.Value" class="checkbox-inline" />
    @Html.Label(item.Value, new { @class = "control-label" })
}