首页 > 解决方案 > 在视图中未预先选择具有选定值的 MultiselectList

问题描述

我有一个简单的服务: 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 时,没有预先选择任何项目?我在这里想念什么?

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

解决方案


出现问题是因为您在此行中使用与绑定到帮助器的ViewData模型名称相同的键名:ListBox

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

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

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

ListBox(For)然后在助手中使用新的键名:

列表框助手

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

ListBoxFor 助手

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

推荐阅读