1

Rolesコントローラーアクションメソッドへのアクセスを許可された文字列を宣言して、私が今やっている方法は次のとおりです。

[Role(Roles="Regular User, Accounting, Administrator")]
public ActionResult ChangeAvatar()
{
    if (User.Identity.IsAuthenticated)
    {
        var user = _userRepository.FindUserByEmail(User.Identity.Name);
        var model = new ChangeAvatarModel();
        model.CurrentAvatarUrl = user.AvatarUrl;

        return View(model);
    }

    return RedirectToAction("Login", "Account");
}

を文字列として書きたくないのは、Rolesタイプミスして予期しないバグが発生する可能性があるためです。私はむしろそれらを一度書き、それで終わりたいと思います。

このユースケースに何を使用することをお勧めしますか? dictionary<enum, string>? _

[Role(Roles=DefinedRoles.Accounting)] // Would return string: "Regular User, Account"
public ActionResult ChangeAvatar()
{
    if (User.Identity.IsAuthenticated)
    {
        var user = _userRepository.FindUserByEmail(User.Identity.Name);
        var model = new ChangeAvatarModel();
        model.CurrentAvatarUrl = user.AvatarUrl;

        return View(model);
    }

    return RedirectToAction("Login", "Account");
}
4

2 に答える 2

2

静的定数クラスを使用できます。

public static class DefinedRoles
{
    public const string Accounting = "Regular User, Accounting, Administrator";
}
于 2012-09-20T15:50:51.267 に答える
0

現在、このアプローチを試していますが、これまでのところ良い..

public class StringEnum
{
    private static IDictionary<string, StringEnum> _items = new Dictionary<string, StringEnum>();

    public static readonly StringEnum Type1 = new StringEnum("TYPE1");
    public static readonly StringEnum Type2 = new StringEnum("TYPE2");

    private string _value;

    private StringEnum(string value)
    {
        _value = value;
        _items.Add(_value, this);
    }

    public static implicit operator StringEnum(string value)
    {
        return _items[value];
    }

    public static implicit operator string(StringEnum typeSafeValue)
    {
        return typeSafeValue._value;
    }

    public override bool Equals(object obj)
    {
        return obj.ToString() == _value;
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public override string ToString()
    {
        return _value;
    }
}

次のように使用できます。

StringEnum type = StringEnum.Type1
于 2012-09-20T15:58:08.923 に答える