【问题标题】:MultiselectList with selected values are not pre selected in View在视图中未预先选择具有选定值的 MultiselectList
【发布时间】:2019-08-09 15:23:59
【问题描述】:

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

【问题讨论】:

  • 尝试替换您的ViewData 键名,因为AllRoles 已经用于绑定ListBox,避免潜在的命名冲突。或者将ListBoxFor 与强类型视图模型属性一起使用。
  • 改变 viewDataKey 有效!!从来没有,虽然这可能是问题,你能回答这个问题,我会接受作为解决方案。

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


【解决方案1】:

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

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

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

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

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

列表框助手

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

ListBoxFor 助手

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多