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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在视图中不预先选择具有所选值的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" });

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

答案

出现此问题是因为您在此行中使用相同的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" })

以上是关于在视图中不预先选择具有所选值的MultiselectList的主要内容,如果未能解决你的问题,请参考以下文章

所选值的总最大值

隐藏所有id不是所选值的tr

使用 Angular 复制带有 UI 和所选值的下拉列表

重力根据所选值的数量形成条件逻辑

Angular 材质:在下拉列表中获取所选值的 id

在c#MVC4中获取列表框中所选值的总和