2016-09-17 100 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()); 
}