.NET Core 2中如何获取用户所属角色并生成SelectList?
解决.NET Core 2中用户已分配角色SelectList的类型转换问题
这个问题的核心是你没有正确处理异步方法的返回值,也没有完成角色名称到SelectListItem类型的转换。我来一步步帮你修复:
错误原因拆解
userManager.GetRolesAsync(user)是异步方法,返回的是Task<IList<string>>,必须用await关键字获取实际的角色名称列表,不能直接赋值给List<SelectListItem>类型的属性;- 即便拿到了角色名称列表,它也只是字符串集合,需要转换成
SelectListItem对象才能匹配ViewModel的属性类型。
修正后的完整代码
[HttpGet] public async Task<IActionResult> EditUser(string id) { EditUserViewModel model = new EditUserViewModel(); if (!String.IsNullOrEmpty(id)) { ApplicationUser user = await userManager.FindByIdAsync(id); if (user != null) { model.Name = user.Name; model.Email = user.Email; // 1. 异步获取用户已分配的角色名称列表 var userRoleNames = await userManager.GetRolesAsync(user); // 2. 从角色管理器中筛选出用户的角色,转换成SelectListItem集合 model.ApplicationRoles = roleManager.Roles .Where(role => userRoleNames.Contains(role.Name)) .Select(role => new SelectListItem { Text = role.Name, Value = role.Id }) .ToList(); // 如果你需要的是「显示所有角色并标记用户已选角色」,替换成这段代码: // model.ApplicationRoles = roleManager.Roles.Select(r => new SelectListItem { // Text = r.Name, // Value = r.Id, // Selected = userRoleNames.Contains(r.Name) // }).ToList(); } } return PartialView("_EditUser", model); }
额外提示
- 如果需要支持多角色选择,ViewModel里的
ApplicationRoleId应该改为List<string> ApplicationRoleIds,才能绑定多个选中的角色值; - 永远用
await处理异步方法,避免线程阻塞或拿到未完成的Task对象; - 若用户未分配任何角色,
model.ApplicationRoles会是空列表,你可以在视图中添加判断,显示「无角色」提示或默认选项。
内容的提问来源于stack exchange,提问作者Charles de M.
相关产品推荐
相关产品推荐

