2016-09-17 53 views
0

我想为用户创建多个角色。所有这些都是Basic的共同角色,也是一个额外的选择。我根据从注册表单中选择的整数值得到第二个角色。然后我使用开关将值与角色名称相匹配。 以下是我的尝试,但我得到一个错误“索引超出了数组的界限”。MVC 5 C#params数组字符串

string[] mt = new string[1];

   switch (n) 
       { 
        case 1: 
         mt[0] = "Basic"; 
         mt[1] = "Reader"; 
         break; 
        case 2: 
         mt[0] = "Basic"; 
         mt[1] = "Blogger"; 
         break; 
        case 3: 
         mt[0] = "Basic"; 
         mt[1] = "Editor"; 
         break; 
        default: 
         mt[0] = "Basic"; 
         break; 
       } 


if (mt!= null) 
        { 
         result = await UserManager.AddToRolesAsync(user.Id, mt); 
        } 

我真的不知道,如果我这样做的正确方法。任何帮助将不胜感激

+0

你的代码试图访问你的数组中的第一个和第二个项目。但是你的数组长度是多少?看起来它只有1个。这就是你得到这个错误的原因。你的数组只有一个项目,并且你正在尝试访问第二个项目! – Shyju

回答

0

你的阵列只能有一个值,因为它有1.增量的长度缓解其使用string[] mt = new string[2];

然后你就可以减少一些重复,因为你始终分配“基本设置”,然后甩掉多余的空支票的2尺寸:

string[] mt = new string[2] {"Basic", null}; 
switch (n) 
{ 
    case 1: 
     mt[1] = "Reader"; 
     break; 
    case 2: 
     mt[1] = "Blogger"; 
     break; 
    case 3: 
     mt[1] = "Editor"; 
     break; 
    default: break; 
} 

result = await UserManager.AddToRolesAsync(user.Id, mt); 

但是:我建议一个不同的更清晰的方法:

//create a dictionary with all roles 
var roleDic = new Dictionary<int, string> { 
    {1, "Reader"}, 
    {2, "Blogger"}, 
    {3, "Editor"}, 
}; 

//get the role that matches your n variable 
var newRole = roleDic.FirstOrDefault (d => d.Key == n).Value; 
//create the array for the UserManager 
var roles = !String.IsNullOrEmpty(newRole) ? new [] {"Basic", newRole} : new[] {"Basic"}; 

result = await UserManager.AddToRolesAsync(user.Id, roles); 

如果你想给每个用户添加多个角色和正变得int值的集合,这成为:

var roleDic = new Dictionary<int, string> { 
    {1, "Reader"}, 
    {2, "Blogger"}, 
    {3, "Editor"}, 
    {4, "SuperUser"}, 
    {5, "Administrator"}, 
    {6, "BackupAdmin"} 
}; 

var rolestoAdd = new List<int> { 2, 4}; 

var newRoles = roleDic.Where(x => rolestoAdd.Contains(x.Key)) 
        .Select (x => x.Value); 
var roles = new List<string> {"Basic"}; 

roles.AddRange(newRoles); 
result = await UserManager.AddToRolesAsync(user.Id, roles.ToArray()); 

通过这种方式,您可以为自己节省一个笨拙的开关语句,这种语句可能会在几页之后增长,一旦您碰到20个左右的角色。另外你已经从你的逻辑中分离出你的角色定义,并且(imho)它更具可读性。 (其他人可能会发现一个巨大的开关或if-else块更简洁,这取决于你。)

0

变化string[] mt = new string[1];string[] mt = new string[2]; 您的数组中的代表项目金额之间[]的NUMER

你可能在想最大指数

+0

感谢您成为第一个帮助 – Diin

0

如果数组的长度是可变的,你应该使用List<string>代替:

// Initialize list of roles and "Basic" beforehand 
// as it should be added at any case. 
List<string> mt = new List<string> { "Basic" }; 
// Add additional roles as needed 
switch (n) 
{ 
    case 1: 
     mt.Add("Reader"); 
     break; 
    case 2: 
     mt.Add("Blogger"); 
     break; 
    case 3: 
     mt.Add("Editor"); 
     break; 
} 


if (mt!= null) 
{ 
    result = await UserManager.AddToRolesAsync(user.Id, mt.ToArray()); 
}