无法将PermissionViewModel实例转换为列表,求可行解决方案
解决PermissionViewModel转列表的问题
你调用model.ToList()无效的核心原因是:PermissionViewModel是单个实体对象,并非实现了IEnumerable<T>接口的可枚举集合,ToList()方法仅对集合类型生效,单个对象自然无法直接转成列表。
结合你的业务逻辑,实际需要做的是把处理好的allPermissions(List
1. 确认PermissionViewModel的结构
首先确保你的PermissionViewModel类定义了用于存储权限列表的集合属性,示例如下:
public class PermissionViewModel { public string RoleId { get; set; } public string RoleName { get; set; } // 新增集合属性,用于存放权限列表 public List<RoleClaimsViewModel> Permissions { get; set; } }
2. 修改控制器代码
将代码中无效的model.ToList();替换为把allPermissions赋值给model的集合属性:
// 替换原有的model.ToList(); model.Permissions = allPermissions;
修改后的完整控制器代码:
public async Task<ActionResult> Index(string roleId) { var model = new PermissionViewModel(); var allPermissions = new List<RoleClaimsViewModel>(); allPermissions.GetPermissions(typeof(Constants.Permissions.Products), roleId); allPermissions.GetPermissions(typeof(Constants.Permissions.Services), roleId); allPermissions.GetPermissions(typeof(Constants.Permissions.Projects), roleId); allPermissions.GetPermissions(typeof(Constants.Permissions.Blogs), roleId); var role = await _roleManager.FindByIdAsync(roleId); model.RoleId = roleId; model.RoleName = role.Name; var claims = await _roleManager.GetClaimsAsync(role); var allClaimValues = allPermissions.Select(a => a.Value).ToList(); var roleClaimValues = claims.Select(a => a.Value).ToList(); var authorizedClaims = allClaimValues.Intersect(roleClaimValues).ToList(); foreach (var permission in allPermissions) { if (authorizedClaims.Any(a => a == permission.Value)) { permission.Selected = true; } } // 将处理好的权限集合赋值给model的对应属性 model.Permissions = allPermissions; return View("/Views/Backend/Usermanagment/Permission/Index1.cshtml", model); }
3. 视图层适配
如果视图需要遍历权限列表,直接遍历model的Permissions属性即可,示例如下:
@model PermissionViewModel <h3>@model.RoleName 的权限设置</h3> <ul> @foreach (var perm in model.Permissions) { <li> <input type="checkbox" checked="@perm.Selected" /> @perm.Value </li> } </ul>
内容的提问来源于stack exchange,提问作者Abood
相关产品推荐
相关产品推荐

