2012-09-20 40 views
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作爲一個字符串,因爲我可能會輸錯和導致意外的錯誤。我寧願給他們寫一次,並完成它。

你對這個用例有什麼建議? A 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"); 
} 

回答

2

你可以使用一個靜態常量類:

public static class DefinedRoles 
{ 
    public const string Accounting = "Regular User, Accounting, Administrator"; 
} 
+0

絕對是最簡單的方法。 – verdesmarald

+1

好吧 - 現在我感覺很傻。時間起牀散步。謝謝! – sergserg

+0

雖然這不是類型安全的,但您仍然需要可以包含任何值的字符串數據類型。想象一下,加入團隊的新開發人員不知道存在一個不斷定義的問題。他將傳遞一個字符串而不使用常量。我會進一步尋找類型安全的解決方案。 – Shikyo

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 
+1

Hi @Shikyo,你可能想看看Codeplex上的SpecializedEnum,如果你想要使用枚舉類型的路線。 http://specializecarbon.codeplex.com/ – JamieSee

+0

看起來很有趣,會看看謝謝。 – Shikyo

相關問題