我很难弄清楚如何使用传递给AddUsersToRoles的两个字符串数组。
以下是我认为我需要做的事情:
这是它的样子:
//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);
}
}
现在,我不知道我是否会在这方面走得更远。我一直在寻找其他人如何处理这类事情的例子,但我找不到任何答案。
答案 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++;
}
虽然我不确定如何设置数据库,所以不知道这是否有用。