【问题标题】:Create DropDownLists for User Roles为用户角色创建下拉列表
【发布时间】:2015-12-09 03:25:25
【问题描述】:

我想要达到的目标

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

问题

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

问题

如何使用正确选择的角色生成所需的 DropDownLists?

视图模型

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 ...")
}

【问题讨论】:

  • RoleListId 包含单个 id?
  • RoleListId 包含单个 id - 是
  • 所选选项将是RolesListId 的值(因为您绑定到RolesListId)。并且在绑定到属性时忽略设置SelectListItemSelected 属性。但是RolesListId 是一个值类型 (string)`,所以无论如何你都不能将多个下拉列表绑定到它,所以不清楚你想要实现什么。
  • 我怀疑你想要的属性 RolesListIdList&lt;string&gt; 并且你想要一个 @Html.ListBoxFor(m =&gt; m.RolesListId, Model.RolesList) 它将显示所有角色,如果 RolesListId 包含 3 个值,那么这 3 个选项将被选中。
  • 您接受的解决方案意味着您只能拥有 3 个角色。您不能添加新角色。您不能删除角色。您不能进行客户端或服务器端验证。您可以多次选择相同的角色。每个角色都需要一个 &lt;select multiple="multiple&gt;(即ListBoxFor())或复选框。

标签: c# model-view-controller asp.net-mvc-5 html.dropdownlistfor asp.net-mvc-viewmodel


【解决方案1】:

这是您需要的代码,但是当用户可以拥有多个角色时,最好使用DropDownList 列表,而不是使用CheckBoxes

  • 用户和角色之间存在 (n 到 n) 关系,而下拉列表永远不能表示这种关系。
  • 如果您使用的不仅仅是下拉列表,用户可以从 list1 中选择 role1,从 list2 中再次选择 role1,从列表 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")
}

如果您决定使用 CheckBoxes,下面是代码:

@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" })
}

【讨论】:

  • 我真的需要使用下拉列表,原来的代码是用于复选框的,所以我已经有了工作复选框。可能有 50 个角色,所以复选框太多了。如果用户只是 1 个角色的成员,那只有一个下拉列表,而不是 50 个复选框。
  • @DrewWelsh 也许我可以修复您的代码以呈现下拉菜单,但这是不正确的设计。用户和角色之间存在(n 到 n)关系,而下拉列表永远不能表示这种关系。如果您使用的不仅仅是下拉列表,用户可以从 list1 中选择角色 1,从 list2 中再次选择角色 1,从列表 3 中再次选择角色 1。
  • 我已经测试了您的解决方案,效果很好,谢谢。如果不忘恩负义,我将如何使用 DropDownListFor?
  • @DrewWelsh 欢迎您,如果您想使用DropDownListFor(model=&gt;model.SelectedRole, ...),那么您的UserViewModel 中应该有一个List&lt;string&gt; 类型的SelectedRole 属性。
  • @DrewWelsh 顺便说一句,在 StackOverflow 中,当您发现一个有用的答案时,您可以接受它作为答案和/或投票给它以使其对其他用户更有用:)
猜你喜欢
  • 2020-06-06
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
相关资源
最近更新 更多