2

ユーザーがどのロールに属しているかを判断し、ロール番号を割り当てるために多くのチェックがあります。チェックを簡単にする方法はありますか?

        if (User.IsInRole("Super"))
        {
            ViewBag.Role = 30;
        }
        else if (User.IsInRole("Admin"))
        {
            ViewBag.Role = 20;
        }
        ...
        ...
        else if (User.IsInRole("Guest"))
        {
            ViewBag.Role = 10;
        }
        else
        {
            ViewBag.Role = 5;
        }

私がする必要があるのは、ユーザーが属する最高の役割を見つけて、その値を動的変数である ViewBag.Role に割り当てることです。上記のコードは機能しますが、すべての if ステートメントと else ステートメントは、適切なコーディング方法とは思えません。

4

6 に答える 6

3

User クラスにプロパティを追加できます。

    public virtual int RoleNumber
    {
        get
        {
            if (this.IsInRole("Super")) return 30;
            if (this.IsInRole("Admin")) return 20;
            if (this.IsInRole("Guest")) return 10;
            return 5;
        }
    }

そしてビューで:

ViewBag.Role = User.RoleNumber
于 2012-05-25T17:41:11.553 に答える
2

文字列の代わりに列挙型を使用します。これにより、コンパイル時に名前をチェックすることができます。

次のコードは、下線を引く役割チェックロジックを変更せずに、役割を変更(広告または削除)する柔軟性を提供します。

    public int IsInRole()
    {
        int defaultValue = (int)UserRole.Default;
        var names = Enum.GetNames(typeof (UserRole));

        foreach (var name in names)
        {
            if(User.IsInRole(name))
            {
                defaultValue = (int)((UserRole)Enum.Parse(typeof(UserRole), name));
                break;
            }
        }

        return defaultValue;
    }

public enum UserRole
{
    Super = 30,
    Admin = 20,
    Guest = 10,
    Default = 5
}
于 2012-05-25T17:54:20.737 に答える
2

ユーザーがロールを 1 つしか持っていない場合は、ロールの配列を返す GetRoles メソッドを使用して、ロールに値がないかどうかを確認できます。
そうであれば、ユーザーが持っている最初で唯一の役割を、ビューバッグに提供したい値を持つ列挙型として解析できます。配列に値がない場合 - デフォルトの最小値を指定できます。


複数の役割がある場合は、より「洗練された方法」で解決できますが、結局のところ、単純な if..else コードよりも開発、理解、実行に多くの費用がかかるでしょう。

于 2012-05-25T17:35:07.140 に答える
1

Role クラスが次のようになっていると仮定します。

public class Role
{
    public string Name { get; set; }
    public int Number { get; set; }
    ......
}

使用できます

var roles = GetYourRoles(); // IEnumerable<Role>    
var result = roles.First(r => User.IsInRole(r.Name));
于 2012-05-25T19:00:56.333 に答える
1

次のようなことを試すことができます:

Dictionary<string, int> weight = new Dictionary<string, int>();
weight.Add("Super", 30);
weight.Add("Admin", 20);
weight.Add("Guest", 10);

string[] roles = Roles.GetRolesForUser(User.Identity.Name);
if (roles.Any())
{
  ViewBag.Role = weight.Where(w => roles.Contains(w.Key))
    .OrderBy(w => w.Value)
    .FirstOrDefault();
}
else
{
  ViewBag.Role = 5;
}
于 2012-05-25T17:36:35.597 に答える
0

ASP.NET の Role テーブルを拡張するのはどうですか? 各役割に固定の重みがある場合は、テーブル (RoleWeightまたは何かと呼ばれる) を作成し、その役割で目的の重みを設定します。そうすれば、何も設定する必要はありません (そして、「適切なコーディング手法のように見えない」コードを排除します) 代わりに、既にそこに値があります。

于 2012-05-25T17:32:07.210 に答える