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

问题描述 投票:0回答:1

我有一个简单的服务: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" });

但是当我导航到查看时,没有预先选择的项目?我在这里错过了什么?

c# asp.net asp.net-mvc asp.net-mvc-4 razor
1个回答
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)帮助器中使用新的密钥名称:

ListBox助手

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

ListBoxFor帮助器

@Html.ListBoxFor(model => model.AllRoles, (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })
© www.soinside.com 2019 - 2024. All rights reserved.