我有3张桌子。 Users
,Roles
和RolesToUsers
以下是User
型号:
public partial class User
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public User()
{
this.UserToRoles = new HashSet<UserToRole>();
}
[Key]
public int Id { get; set; }
public string Name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<UserToRole> UserToRoles { get; set; }
}
以下是Role
型号:
public partial class Role
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Role()
{
this.UserToRoles = new HashSet<UserToRole>();
}
[Key]
public int Id { get; set; }
public string RoleName { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<UserToRole> UserToRoles { get; set; }
}
这里是UserToRole
型号:
public partial class UserToRole
{
[Key]
public int Id { get; set; }
[ForeignKey("Role")]
public Nullable<int> RoleId { get; set; }
[ForeignKey("User")]
public Nullable<int> UserId { get; set; }
public virtual Role Role { get; set; }
public virtual User User { get; set; }
}
我需要向所有用户展示并与之相关的角色。
我写这个回购方法
public List<UserViewModel> GetUsers()
{
var result = db.UserToRoles.Select(x=>new UserViewModel
{
UserName = x.User.Name,
RoleName = x.Role.RoleName
}).ToList();
return result;
}
一切都很好,但是如果我通过js在屏幕上显示它,例如我有Ronald用户有2个角色,它显示为Ronald - Admin
和Ronald - User
。
我需要像Ronald - Admin,User
一样展示它。
以下是我的js脚本现在的样子。
function GetUsers() {
let url = "/Home/GetUsers";
$.ajax({
type: 'GET',
url: url,
dataType: 'json',
success: function (data) {
var separator = "";
for (var i = 0; i < data.length; ++i) {
$('#taskresult3').append(separator + '<b>' + data[i].UserName + "-" + data[i].RoleName + '</b>');
separator = ",";
}
}
});
}
我如何解决问题?
答案 0 :(得分:1)
您应该将服务器上的角色与他们关联的用户进行分组。例如,像这样的模型:
public class UserViewModel
{
public string UserName { get; set; }
public IEnumerable<string> Roles { get; set; }
}
现在进行查询:
public List<UserViewModel> GetUsers()
{
var users = db.Users
.Include(u => u.UserToRoles.Select(ur => ur.Role))
.Select(u => new UserViewModel
{
UserName = u.Name,
Roles = u.UserToRoles.Select(ur => ur.Role.Name)
})
.ToList();
return users;
}
现在,在客户端上,您可以按用户循环访问数据用户,例如:
function GetUsers() {
let url = "/Home/GetUsers";
$.ajax({
type: 'GET',
url: url,
dataType: 'json',
success: function (data) {
var separator = "";
for (var i = 0; i < data.length; ++i) {
var userRow = data[i].UserName + " - " + data[i].Roles.join(", ");
$('#taskresult3').append(separator + userRow);
separator = ",";
}
}
});