获取与一个用户相关的所有角色(ASP.NET)

时间:2018-02-12 15:32:09

标签: javascript asp.net asp.net-mvc entity-framework

我有3张桌子。 UsersRolesRolesToUsers

以下是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 - AdminRonald - 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 = ",";
            }
        }
    });
}

我如何解决问题?

1 个答案:

答案 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 = ",";
            }
        }
});
相关问题