c# - 在视图中未预先选择具有选定值的 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 时,没有预先选择任何项目?我在这里想念什么?
解决方案
出现问题是因为您在此行中使用与绑定到帮助器的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" })
推荐阅读
- python - 如何对数据库执行异步批量导入?
- sql-server - Azure SQL database point in time restore taking over 24 hrs
- javascript - 将请求传递到函数中生成的 Apollo Server 上下文
- c - 这个 struct 的错误信息是什么意思?
- angular - repeat() 重复订阅而不更新
- database - NoSQL 数据库 - 在本地服务器而不是数据库服务器上保存 JSON 文件
- cluster-computing - Slurm 数组作业,每个节点最多有一个并发作业
- webpack - UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'startsWith' of undefined in antd and nextjs
- java - 运行示例数据时 MaxEnt 出现问题
- javascript - 如何通过 Github API 创建树?