在视图中未预先选择具有所选值的MultiselectList

时间:2019-03-19 07:01:33

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我有一个简单的服务: 1.获取系统中的所有角色 2.检查当前所选用户的角色 3.在下拉菜单中呈现所有角色,默认情况下选择当前用户角色

为此,我有以下代码:

 public ActionResult Edit(string userId)
        {

            var user = _oAuthUserService.GetUsers()?.Where(u => u.UserId == userId).FirstOrDefault();

            var userRoles = user.Roles; //[Admin,Manager]

            var allRolesFromService = _oAuthUserService.AllRoles.Select(x=>new {
                Id =x.RoleName,
                Name =x.RoleName
            }).ToList(); //All roles in the System [Role1,Role2,Role3,Admin,Manager]


            ViewData["AllRoles"] = new MultiSelectList(allRolesFromService, "Id", "Name", userRoles);


            return View(user);


        }

鉴于我正在做

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRoles"], new { multiple = "multiple" });

但是当我导航到view时,没有一个项目被预选吗?我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

发生此问题是因为您在此行中使用的ViewData键名与绑定到ListBox助手的模型名相同:

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRoles"], new { multiple = "multiple" })

假设AllRoles是viewmodel类中的数组或列表属性,则不能将其用作ViewData键名,因为它们之间会发生命名冲突,从而导致选项列表不会显示正确地。您可以使用与viewmodel的属性名称不同的名称重命名ViewData键名:

ViewData["AllRolesList"] = new MultiSelectList(allRolesFromService, "Id", "Name", userRoles);

然后在ListBox(For)帮助器中使用新的密钥名称:

列表框助手

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })

列表框用于帮助

@Html.ListBoxFor(model => model.AllRoles, (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })