【问题标题】:How to implement AddUsersToRoles method in RoleProvider class?如何在 RoleProvider 类中实现 AddUsersToRoles 方法?
【发布时间】:2020-12-17 15:33:02
【问题描述】:

我正在开发一个简单的 mvc 应用程序,其中通过选择列表显示所有用户,并通过另一个选择列表显示所有角色。我想从用户下拉列表中选择一个用户,从角色下拉列表中选择角色。我已经完成了所有工作,但我不知道如何在 Role Provider 类中实现 AddUsersToRoles 方法,而且我也没有从互联网上获得任何示例。请为我提供 AddUsersToRoles 方法的示例。我尝试过这样,但它给出了一个错误,不能将隐蔽类型 string[] 隐含为 int。请提供解决方案。

  public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        EmployeeDBContext context = new EmployeeDBContext();
        UserRolesMapping userRolesMapping = new UserRolesMapping();
        
        userRolesMapping.RoleID = roleNames;
        userRolesMapping.UserID = usernames;
        context.SaveChanges();

    }

【问题讨论】:

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


    【解决方案1】:

    在 Microsoft 的 documentation 上有一个实现此方法的示例。

    您可能需要根据您使用实体框架的标签更改该示例的后半部分(转到 Odbc 的位置)。

    基本上,您需要另一个数据库表UsersInRolesUser 链接到Role。然后,在该表中为usernamesroleNames 的每个组合创建一行。

    -- 编辑:

    根据您的示例,您似乎正朝着正确的方向前进。但是,您尝试将 string 存储到 int 属性中。

    我不知道您的确切模型结构,但它应该看起来像这样:

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        using (EmployeeDBContext context = new EmployeeDBContext())
        {
            if (context.UsersInRoles == null)
            {
                context.UsersInRoles = new List<UserRolesMapping>();
            }
    
            foreach (string username in usernames)
            {
                foreach (string roleName in roleNames)
                {
                    if(IsUserInRole(username, roleName)) continue;
    
                    UserRolesMapping userRoleMapping = new UserRolesMapping();
                    userRoleMapping.Role = roleNames;
                    userRoleMapping.User = usernames;
    
                    context.UsersInRoles.Add(userRoleMapping);
                }
            }
    
            context.SaveChanges();
        }
    }
    
    private static bool IsUserInRole(string username, string roleName)
    {
        using (EmployeeDBContext context = new EmployeeDBContext())
        {
            var userRole = context.UsersInRoles.FirstOrDefault(x => x.User == username && x.Role == roleName);
            return userRole != null;
        }
    }
    

    请注意,您需要进行其他代码更改才能使其正常工作,即本例中的RoleUserstrings,而不是int

    【讨论】:

    • 请看我的代码我试过这样但它给出了一个错误,无法将类型 string[] 隐式转换为 int。我该怎么办?请帮忙。
    • 我已经用一个例子编辑了我的答案。您将需要更改项目中的一些代码并调整我的建议以使用您的代码。
    猜你喜欢
    • 2017-08-20
    • 2010-12-02
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多