选择除管理员以外的所有角色。 C#ASP.NET MVC

时间:2018-12-16 18:28:33

标签: c# asp.net-mvc entity-framework

我有一个控制器操作,必须在admin部分中更改/添加角色。我在用户部分使用了相同的代码来使用公司管理员,以便能够为其公司用户更改/添加角色。问题在于它会列出所有不属于他们的角色,包括Admin。显然我不想要。我正在寻找一种在此语句中放置where子句的方法。

var colAllRoles = RoleManager.Roles.Select(x => x.Name).ToList();

下面是整个Action,也许在Action中有一个更好的位置可以执行此操作?但是,我尝试在其中放置where子句,但它不喜欢它。如果使用“位置”,则似乎无法使用“选择”功能,而没有“选择”功能则根本无法使用。

感谢您的帮助!

private List<string> RolesUserIsNotIn(string UserName)
{
        // Get roles the user is not in
        var colAllRoles = RoleManager.Roles.Select(x => x.Name).ToList();

        // Go get the roles for an individual
        Models.ApplicationUser user = UserManager.FindByName(UserName);

        // If we could not find the user, throw an exception
        if (user == null)
        {
            throw new Exception("Could not find the User");
        }

        var colRolesForUser = UserManager.GetRoles(user.Id).ToList();
        var colRolesUserInNotIn = (from objRole in colAllRoles
                                   where !colRolesForUser.Contains(objRole)
                                   select objRole).ToList();

        if (colRolesUserInNotIn.Count() == 0)
        {
            colRolesUserInNotIn.Add("No Roles Found");
        }

        return colRolesUserInNotIn;
}

编辑

我已经添加了我的私人UserAndRoles GetUserAndRoles。这是填充列表的地方。我已经采取了将其排除在RolesUserIsIn中的建议,并修改了以下代码,以便在不使用Admin的情况下填充列表。

已更改的代码行:

 ViewBag.AddRole = new SelectList(RolesUserIsIn(UserName));

这是带有更改的整个代码示例:

    private UserAndRolesDTO GetUserAndRoles(string UserName)
    {
        // Go get the User
        Models.ApplicationUser user = UserManager.FindByName(UserName);

        List<UserRoleDTO> colUserRoleDTO =
            (from objRole in UserManager.GetRoles(user.Id)
             select new UserRoleDTO
             {
                 RoleName = objRole,
                 UserName = UserName
             }).ToList();

        if (colUserRoleDTO.Count() == 0)
        {
            colUserRoleDTO.Add(new UserRoleDTO { RoleName = "No Roles Found" });
        }

        var roleList = RolesUserIsNotIn(UserName);
        var roleListWithoutAdmin = roleList.Where(f => f != "Administrator");
        ViewBag.AddRole = new SelectList(roleListWithoutAdmin);

        // Create UserRolesAndPermissionsDTO
        UserAndRolesDTO objUserAndRolesDTO =
            new UserAndRolesDTO
            {
                UserName = UserName,
                ColUserRoleDTO = colUserRoleDTO
            };
        return objUserAndRolesDTO;
    }

1 个答案:

答案 0 :(得分:0)

您可以执行where条件,将Admin角色项从角色列表中排除。

我不会在RolesUserIsNotIn方法中这样做。我会在方法之外进行操作,以便该方法仅做一件事,获得用户不属于的角色。

首先调用您的方法,该方法将获得用户不属于的角色列表。然后在该方法上调用Where方法以排除特定项目。

var roleList = RolesUserIsNotIn("SomeuserName");
//Not exclude Admin
var roleListWithoutAdmin = roleList.Where(f=>f!="Admin");

变量roleListWithoutAdmin的类型为IEnumerable<string>。如果需要列表,可以在该列表或LINQ表达式上调用ToList()方法。