2016-09-17 14 views
0

ユーザー用に複数のロールを作成しようとしています。基本的なものと選択肢の追加的な役割という共通の役割があります。サインフォームから選択した整数値に基づいて2番目の役割を取得します。次に、スイッチを使用して値をロール名に一致させます。 以下は私が試みたものですが、「インデックスは配列の境界外です」というエラーが表示されます。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

あなたのコードはあなたの配列の最初と2番目の項目にアクセスしようとしています。しかし、配列の長さはどのくらいですか?それは1のように見えます。それがあなたがそのエラーを得ている理由です。あなたの配列にはアイテムが1つしかなく、2番目のアイテムにアクセスしようとしています! – Shyju

答えて

0

あなたの配列、それは1 INCRの長さを持っているので、唯一、一つの値を保持することができますあなたは、常に「基本」を割り当て、冗長ヌルチェックを取り除くため、次にあなたは、いくつかの重複を減らすことができ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); 

あなたはユーザーごとに複数の役割を追加したい場合は、nは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桁のロールにヒットした後、数ページにわたって成長する不器用なswitch文を自分で保存できます。さらに、あなたのロジックからあなたの役割定義を分離しました。そして、それはより読みやすくなりました。 (他のユーザーは巨大なスイッチを見つけたり、if-elseブロックをより簡潔にブロックする可能性があります。それはあなた次第です)

0

変更string[] mt = new string[1]; string[] mt = new string[2];にNUMER理解されるであろうおそらく代わりに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()); 
} 
+0

最初に助けてくれてありがとう – Diin

0

のことを考えていたあなたの配列

内の項目の量を意味[]の間