簡體   English   中英

MVC 5身份。 用戶角色

[英]MVC 5 Identity. Roles for User

我需要顯示一組復選框才能管理用戶角色。 我可以提出所有現有角色的觀點:

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

而且我可以為用戶提供角色到視圖中:

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

但是,我應該怎么做才能顯示綁定到Model.Roles的所有角色,然后保存更改?

您將角色的ID作為值放在表單上,​​然后接收到一個選定角色的int表il控制器

在我的一個項目中,這是您應該感興趣的代碼的一部分:

向視圖提供數據的控制器:

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>

這是我的方法。

在角色管理器上創建擴展方法,將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" />
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM