MVC 5身份。用户的角色

时间:2015-03-11 12:57:44

标签: c# asp.net-mvc-5 checkboxlist

我需要显示一组复选框才能管理用户角色。 我可以看到所有现有角色:

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MlmDbContext()));
ViewBag.allRoles = roleManager.Roles.ToList();

我可以让用户进入视图角色:

@{
    foreach (var role in Model.Roles)
 {

但是我该怎么做才能显示绑定到Model.Roles的所有角色而不是保存更改?

2 个答案:

答案 0 :(得分:1)

您将角色的ID作为值放在表单上,​​然后接收所选角色的int表控制器

在我的一个项目中,这是您感兴趣的代码的一部分:

为视图提供数据的控制器:

public async Task<ActionResult> Create()
        {
            // Get the list of Roles
            ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");

            return View();
        }

显示角色的视图:

<div class="form-group">
        <label class="col-md-2 control-label">
            @Resources.Global.SelectRole
        </label>
        <div class="col-md-10">
            @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" })
            }
        </div>
    </div>

接收角色的控制器:

[HttpPost]
        public async Task<ActionResult> Create(RegisterViewModel userViewModel, params string[] selectedRoles)
        {
            if (ModelState.IsValid)
            {...}
        }

修改

好的,这就是我认为你需要的东西:

在控制器中:

RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
            {
                Selected = userRoles.Contains(x.Name),
                Text = x.Name,
                Value = x.Name
            }),

在视图中:

<div class="form-group">
            @Html.Label("Roles", new { @class = "control-label col-md-2" })
            <span class=" col-md-10">
                @foreach (var item in Model.RolesList)
                {
                    <input type="checkbox" name="SelectedRole" value="@item.Value" checked="@item.Selected" class="checkbox-inline" />
                    @Html.Label(item.Value, new { @class = "control-label" })
                }
            </span>
        </div>

答案 1 :(得分:0)

我是这样做的。

在角色管理器上创建一个扩展方法,将ApplicationRole替换为您用于角色的任何类名。

public static class RoleManagerExtensions
{
    public static List<CheckBoxItem> GetRolesSelectList(
        this RoleManager<ApplicationRole> roleManager,
        IList<string> selectedValues)
    {
        List<CheckBoxItem> roles = 
            roleManager.Roles.ToList().Select(r => new CheckBoxItem
        {
            Selected = selectedValues.Contains(r.Name),
            Id = r.Name,
            Name = r.Name
        }).ToList();
        return roles;
    }
}

这是CheckBoxItem POCO:

public class CheckBoxItem
{
    public bool Selected { get; set; }
    public string Id { get; set; }
    public string Name { get; set; }
}

在您的控制器中获取角色列表并传入所选角色:

var selectedRoles = await _userManager.GetRolesAsync(user);
List<CheckBoxItem> roles = _roleManager.GetRolesSelectList(selectedRoles);

在您的视图中,您可以创建如下所示的复选框:

 @for (int i = 0; i < Model.Roles.Count; i++)
 {
     <input type="checkbox" asp-for="@Model.Roles[i].Selected" />
     <label asp-for="@Model.Roles[i].Selected">@Model.Roles[i].Name</label>
     <input type="hidden" asp-for="@Model.Roles[i].Id" />
     <input type="hidden" asp-for="@Model.Roles[i].Name" />
 }