无法正确绑定 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,
});
}
}
我在剃须刀页面项目中有多对多关系,出于权限原因,在一个较大的项目中将角色 (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,
});
}
}