2013-08-30 63 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中。