SelectListItem 中的 OptGroup 未显示在 DropDownList 中

OptGroup in SelectListItem Not showing in DropDownList

我用SelectListItem写了一个在DropDownlist中显示Items和In Groups的方法,但问题是只显示第一个组名和child加上其他组的child。问题是不显示第二、第三、.. 组(但显示他们的 childs)。 我的模特是

public class PermissionsViewModel
    {
        public long ID { get; set; }
        public string Title { get; set; }
        public long TypeId { get; set; }
        public long? ParentId { get; set; }
        public string ParentTitle { get; set; }
        public List<PermissionsViewModel> ParentList { get; set; }
        public List<PermissionsViewModel> OperationsList { get; set; }
        public List<PermissionTypesDto> PermissionTypesList { get; set; }
        public bool Status { get; set; }
    }

检索数据的方法:

public Dictionary<long?,List<PermissionsViewModel>> GetPermissionsByModule()
        {
            var ItemValue = (_ipermissionTypes.Expose().FirstOrDefault(x => x.Title == "Operation").Id);

            var permissionbymodule = _ntumcontext.Tbl_Permissions
                .Where(x => x.Status == true && x.TypeId == ItemValue)
                .Select(x => new PermissionsViewModel
                {
                    ID = x.ID,
                    Title = x.Title,
                    Status = x.Status,
                    ParentId = x.ParentId,
                    ParentTitle=x.permission.Title,
                    TypeId=x.TypeId,
                }).AsEnumerable().GroupBy(x => x.ParentId).ToList();

            return permissionbymodule.ToDictionary(k => k.Key, v => v.ToList());
        }

以及进入剃须刀页面(查看)的方法:

public List<SelectListItem> Permissions = new List<SelectListItem>();
public List<SelectListItem> GetPermissionsByModule()
            {
                var AllPermissions = _ipermissionsApplication.GetPermissionsByModule();
                foreach (var (key, value) in AllPermissions)
                {
    
                    var parentTitle = _ipermissionsApplication.GetDetails(key).Title; //get group title from key
                    var group = new SelectListGroup() { Name = parentTitle };
                    foreach (var per in value)
                    {
                        var item = new SelectListItem(per.Title, per.ID.ToString())
                        {
                            Group = group
                        };
                        Permissions.Add(item);
                    }
    
                }
                return Permissions;
            }

在 cshtml 中:

<select asp-for="RoleVM.SelectedPermissions" asp-items="Model.Permissions">

目前上面的代码,问题是不显示第二个和第三个和...,只显示第一个组名,但显示所有组的所有 child 项。

首先,您需要检查AllPermissions的值,可能parentID不存在,然后您需要检查var parentTitle = _ipermissionsApplication.GetDetails(key).Title;可能是第二个和第三个以及.. parentTitle是否为空。

这是一个工作演示(我使用假数据):

public class TestPermissionsModel : PageModel
    {
        public List<SelectListItem> Permissions = new List<SelectListItem>();
        
        public void GetPermissionsByModule()
        {
            var AllPermissions = new Dictionary<long, List<PermissionsViewModel>>()
            {
                {1,new List<PermissionsViewModel>{ new PermissionsViewModel{ ID=11,Title="title11", ParentId=1}, new PermissionsViewModel { ID = 12, Title = "title12", ParentId = 1 } } },
                {2,new List<PermissionsViewModel>{ new PermissionsViewModel{ ID=21,Title="title21", ParentId=2}, new PermissionsViewModel { ID = 22, Title = "title22", ParentId = 2 } } },
                {3,new List<PermissionsViewModel>{ new PermissionsViewModel{ ID=31,Title="title31", ParentId=3}, new PermissionsViewModel { ID = 32, Title = "title32", ParentId = 3 } } }


            };
            foreach (var (key, value) in AllPermissions)
            {

                var parentTitle = "parentTitle" + key; //get group title from key
                var group = new SelectListGroup() { Name = parentTitle };
                foreach (var per in value)
                {
                    var item = new SelectListItem(per.Title, per.ID.ToString())
                    {
                        Group = group
                    };
                    Permissions.Add(item);
                }

            }
        }
        public void OnGet()
        {
            GetPermissionsByModule();

        }
    }

查看:

<select  asp-items="Model.Permissions"></select>

结果: