CustomRoleProvider:使用AddUsersToRoles

时间:2012-02-20 17:55:22

标签: c# asp.net-mvc-3

我很难弄清楚如何使用传递给AddUsersToRoles的两个字符串数组。

以下是我认为我需要做的事情:

  • 首先获取string [] usernames的int UserID。
  • 然后获取string []角色的int RoleID。
  • 将两个阵列连接在一起。
  • 将数据保存到UserRole(包含3列的数据库:UserRoleID,UserID,RoleID)。

这是它的样子:

//override and implement a custom 'adduserstoroles' from the abstract method in RoleProvider

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        int[] userid;

        foreach(var username in usernames)
        {
            User user = AuthRepository.GetUser(username);
            //Error 1: An object reference is required for the non-static field, method, or property 'CustomAuth.AuthRepository.GetUser(string)'

            userid = user.ID;
            //Error 2: Cannot implicitly convert type 'int' to 'int[]'

        }

        int[] roleid;

        foreach(var rolename in roleNames)
        {
            Role role = db.Roles.Where(r => r.RoleName == rolename).SingleOrDefault();

            roleid = role.RoleID;
            //Error 3: Cannot implicitly convert type 'int' to 'int[]'

        }

        var userroles = userid.Concat(roleid).ToArray(); 

        foreach(var userrole in userroles)
        {
            UserRole userRole = new UserRole();
            db.UserRoles.Add(userRole);

        }

    }

public override void AddUsersToRoles(string[] usernames, string[] roleNames) { int[] userid; foreach(var username in usernames) { User user = AuthRepository.GetUser(username); //Error 1: An object reference is required for the non-static field, method, or property 'CustomAuth.AuthRepository.GetUser(string)' userid = user.ID; //Error 2: Cannot implicitly convert type 'int' to 'int[]' } int[] roleid; foreach(var rolename in roleNames) { Role role = db.Roles.Where(r => r.RoleName == rolename).SingleOrDefault(); roleid = role.RoleID; //Error 3: Cannot implicitly convert type 'int' to 'int[]' } var userroles = userid.Concat(roleid).ToArray(); foreach(var userrole in userroles) { UserRole userRole = new UserRole(); db.UserRoles.Add(userRole); } }

现在,我不知道我是否会在这方面走得更远。我一直在寻找其他人如何处理这类事情的例子,但我找不到任何答案。

2 个答案:

答案 0 :(得分:2)

对于错误2和3,您尝试将一个普通的旧int分配给一个int数组,这没有任何意义。您可能只想制作用户ID和角色列表的ints

List<int> roleid = new List<int>();

然后在foreach循环中,你可以

roleid.Add(user.ID);

对于错误1,看起来AuthRepository不是静态类,因此在使用它之前需要创建它的实例。

foreach (var username in usernames) 
{
    AuthRepository repository = new AuthRepository();
    repository.GetUser(username);
    ...
}

答案 1 :(得分:1)

首先,我创建了一个免费的i来跟踪你在阵列中的距离,然后将foreach更改为:

int[] userid = new int[usernames.length];
i=0;
    foreach(string username in usernames)
    {
        User user = AuthRepository.GetUser(username);

        userid[i] = user.ID;
        i++;
    }
int[] roleid = new int[...];
i = 0;

这样你就可以填满userid数组以匹配username数组。 (并为角色做同样的事)

你确定concat是你想要的吗?声明二维数组不是更好吗

int [,] roles = new ...

然后将其填入,因为concat只是将两个数组加在一起,所以你有一个更长的数组。


编辑:

concat将获取第二个数组,并将其添加到第一个数组的末尾,生成一个更长的数组,所以如果你有数组:

userid[1,2,3]
roleid[7,8,9]

然后userid.concat(roleid).ToArray会给你一个更长的数组 result = int [6] {1,2,3,7,8,9}这可能不是你想要的。

我会使用列表,我喜欢列表。然后我会创建你的userRole类,它可能有3个int(对于UserRoleid,Roleid和userid)然后我会在一个带有计数器的循环中迭代,并使用它来创建你的userRole并将它添加到DB :

UserRole userRole;
i = 0;
foreach(int id in userid)
{
     userRole = new UserRole();
     userRole.id = i;                 // Note this line and the next two could be done 
     userRole.user = id;              // in the constructor, passing i, id, roleid[i]
     userRole.role = roleid[i];        
     db.UserRoles.Add(userRole);
     i++;
}

虽然我不确定如何设置数据库,所以不知道这是否有用。