2013-08-30 94 views
0

我有我這樣的枚舉。Enum有多個描述

public enum Gender 
{ 
    Man = 1, 
    Woman = 2 
} 

而且我使用ASP MVC4在下拉菜單中顯示選項。

@Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(Namespace.Models.Enum.Gender)))) 

這工作就像一個魅力,它顯示男人/女人在下拉。 我的問題是,我想在不同的上下文中顯示不同名稱的枚舉。

就像一個環境會是如果你是一個媽媽或爸爸。我想使用性別枚舉作爲基礎,但顯示男人/女人的媽媽/爸爸instad。

另一種情況是男孩/女孩,我仍然想使用性別枚舉,但顯示不同的文本。

這有可能以任何方式嗎?

編輯 我使用凱文的解決方案,並且還添加了另一個像這樣的擴展方法。

public static List<KeyValuePair<string, int>> GetValues(IGenderStrategy genderStrategy) 
    { 
     Dictionary<string, int> arr = new Dictionary<string, int>(); 

     foreach (Gender g in System.Enum.GetValues(typeof(Gender))) 
      arr.Add(g.ToValue(genderStrategy), (int)g); 

     return arr.ToList(); 
    } 

在我看來,我喜歡這樣用。

@Html.DropDownListFor(model => model.Gender, new SelectList(Chores.Models.Enum.EnumExtentions.GetValues(new Chores.Models.Enum.ParentStrategy()), "value", "key")) 
+0

這可能讓你開始。 http://stackoverflow.com/questions/13499747/how-to-get-selectlist-to-honor-displayname-annotation-with-enums?rq=1 –

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

好的,謝謝。我會記住這一點。 – Martin

回答

3

我喜歡@RakotVT使用擴展方法的答案,但會進一步擴展它,因爲您需要一種新的擴展方法來處理不太好的情況。

我認爲戰略模式的變化可能會更好地工作,這裏(http://www.dofactory.com/Patterns/PatternStrategy.aspx

事情是這樣的 -

public enum Gender 
{ 
    Man = 1, 
    Woman = 2 
} 

public interface IGenderStrategy 
{ 
    string DisplayName(Gender gender); 
} 

public class ParentStrategy : IGenderStrategy 
{ 
    public string DisplayName(Gender gender) 
    { 
     string retVal = String.Empty; 
     switch (gender) 
     { 
      case Gender.Man: 
       retVal = "Dad"; 
       break; 
      case Gender.Woman: 
       retVal = "Mom"; 
       break; 
      default: 
       throw new Exception("Gender not found"); 
     } 
     return retVal; 
    } 
} 

public static class EnumExtentions 
{ 
    public static string ToValue(this Gender e, IGenderStrategy genderStategy) 
    { 
     return genderStategy.DisplayName(e); 
    } 
} 

public class Test 
{ 
    public Test() 
    { 
     Gender.Man.ToValue(new ParentStrategy()); 
    } 
} 
+0

謝謝!這工作完美。我又添加了一個擴展來返回一個鍵/值列表,然後一切都按照它應該的方式工作。 – Martin

1

嘗試爲您的Enum添加Extentions類。這是這個類的一個例子。


public static class EnumExtentions 
{ 
    public static string ToChildValue(this Gender e) 
    { 
     string retVal = string.Empty; 

     switch (e) 
     { 
      case Gender.Man: 
       retVal = "Boy"; 
       break; 
      case Gender.Woman: 
       retVal = "Girl"; 
       break; 
     } 
     return retVal; 
    } 


    public static string ToParentValue(this Gender e) 
    { 
     string retVal = string.Empty; 

     switch (e) 
     { 
      case Gender.Man: 
       retVal = "Dad"; 
       break; 
      case Gender.Woman: 
       retVal = "Mom"; 
       break; 
     } 
     return retVal; 
    } 
} 
0

說不上來,如果這是最巧妙的方法,但如何對這樣的:

@functions{ 
    IEnumerable<SelectListItem> GetGenderSelectList(GenderContext genderContext) 
    { 
     return Enum.GetValues(typeof(Namespace.Models.Enum.Gender)).ToList().ConvertAll(x => new SelectListItem(){Value= x.ToString(), Text= GetGenderDescription(x, genderContext)}); 
    } 

    string GetGenderDescription(Gender gender, GenderContext genderContext) 
    { 
     switch (GenderContext) 
     { 
      case Children: return gender == Man? "Boy" : "Girl"; 
      case Parents: return gender == Man? "Dad" : "Mom"; 
      default: return gender.ToString(); 
     } 
    } 
} 

@Html.DropDownListFor(model => model.Gender, GetGenderSelectList(model.GenderContext)) 

這裏GenderContext「是另一個枚舉。

顯然你不需要在頁面功能中有這些功能 - 可以在進入視圖之前將項目列表添加到ViewBag中。