无法正确绑定 Kendo Multi Select 以读取和写入多对多剃须刀模型

Can't bind Kendo Multi Select correctly to read and write to a many to many razor model

我在剃须刀页面项目中有多对多关系,出于权限原因,在一个较大的项目中将角色 (UserRoles) 加入应用程序。我试图获得一个 kendo multi select 控件来通过模型读取和写入数据库。我可以用复选框做到这一点,但条目太多,我需要使用 multiselect 下拉菜单。除了显示和不保存硬编码数组数据外,我无法从 Telerik 获得任何帮助,这是没有用的。我需要从数据库读取和写入赋值。

下面的代码基本上展示了我正在尝试做的事情: selectedRoles 需要是从数据库中 selected RoleID 的整数数组或列表。 在下面的 PopulateAssignedAppRoleData 中,他们正确地读入了 AssignedAppRoleDataList,它调用了 Assigned = appRoles.Contains(role.ID)。然而,selectedRoles 需要调整大小以接受新的 RoleID,因为我在连接 table 中循环。

我不确定在哪里或如何声明 public int[] selectedRoles 在我知道它需要保存多少整数后,或者我是否需要使用 List<>或可枚举的我可以动态调整大小,或者我是否需要一个计数器然后另一个空值来填充循环的重复或.... :(

selectedRoles.Append (role.ID);不起作用

public void UpdateAppRoles(FliveRetryContext 上下文, string[] selectedRoles, App appToUpdate) 保存到数据库的工作正常,我只需要填充数组或列表以填充下拉列表中的 selected 值。

感谢您的帮助,我的 C# 还算基础。

我没有包括所有模型,它们不相关但它们都有效

这是视图中的调用:

@(Html.Kendo().MultiSelectFor(m=>m.selectedRoles)
                        .Placeholder("Select ...")
                        .DataTextField("Role")
                        .DataValueField("RoleID")
                        .BindTo(Model.AssignedAppRoleDataList)

这些是页面模型中的调用:UpdateAppRoles 工作正常

public int[] selectedRoles = new int[] {};      

public void PopulateAssignedAppRoleData(FliveRetryContext context, App app)
        {
            var allRoles = context.Role;
            var appRoles = new HashSet<int>(
                app.RoleAppJoins.Select(c => c.RoleID));
            AssignedAppRoleDataList = new List<AssignedAppRoleData>();
            foreach (var role in allRoles)
            {
                AssignedAppRoleDataList.Add(new AssignedAppRoleData
                {
                    RoleID = role.ID,
                    Role = role.RoleName,
                    Assigned = appRoles.Contains(role.ID)

            });
                //This is where I need to append or count, but I don't know the syntax
        if (appRoles.Contains(role.ID))
            {
             selectedRoles.Append (role.ID);
        }
        }


        }

public void UpdateAppRoles(FliveRetryContext context,
            string[] selectedRoles, App appToUpdate)
        {
            if (selectedRoles == null)
            {
                appToUpdate.RoleAppJoins = new List<RoleAppJoin>();
                return;
            }

            var selectedRolesHS = new HashSet<string>(selectedRoles);
            var appRoles = new HashSet<int>
                (appToUpdate.RoleAppJoins.Select(c => c.Role.ID));
            foreach (var role in context.Role)
            {
                if (selectedRolesHS.Contains(role.ID.ToString()))
                {
                    if (!appRoles.Contains(role.ID))
                    {
                        appToUpdate.RoleAppJoins.Add(
                            new RoleAppJoin
                            {
                                AppID = appToUpdate.ID,
                                RoleID = role.ID
                            });
                    }
                }
                else
                {
                    if (appRoles.Contains(role.ID))
                    {
                        RoleAppJoin roleToRemove
                            = appToUpdate
                                .RoleAppJoins
                                .SingleOrDefault(i => i.RoleID == role.ID);
                        context.Remove(roleToRemove);
                    }
                }
            }
        }

感谢任何考虑过这个的人,但我让它工作了

添加了一个新的 class:

    public class SelectedAppRoles
    {
        public int RoleID { get; set; }
    }

然后是一个新列表

        public List<SelectedAppRoles> selectedRoles;

然后使用列表而不是数组

foreach (var role in allRoles)
            {
                AssignedAppRoleDataList.Add(new AssignedAppRoleData
                {
                    RoleID = role.ID,
                    Role = role.RoleName,
                    Assigned = appRoles.Contains(role.ID)

                });

                if (appRoles.Contains(role.ID))
                {
                    selectedRoles.Add(new SelectedAppRoles
                    {
                        RoleID = role.ID,
                    });                 
                }
            }