2013-08-30 2 views
0

저는이 열거 형을 사용합니다.다중 설명이있는 열거 형

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

그리고 저는 ASP MVC4를 사용하여 드롭 다운 메뉴에서 선택 사항을 표시합니다. 이 마법처럼 작동

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

, 그것은 드롭 다운 남자/여자 표시합니다. 내 문제는 다른 컨텍스트에서 해당 열거 형에 다른 이름을 표시하고 싶습니다.

당신이 엄마 또는 아빠 일 경우처럼 한 가지 맥락 일 것입니다. 나는 성도 enum을 기본으로 사용하고 싶지만 남자/여자의 엄마/아빠 instad를 보여줍니다.

다른 컨텍스트는 Boy/Girl입니다. 여전히 성별 열거 형을 사용하고 싶지만 다른 텍스트를 표시하고 싶습니다.

어떤 방식 으로든 가능합니까?

편집 필자는 Kevin의 솔루션을 사용했으며 이와 같은 또 다른 확장 방법을 추가했습니다. 내가보기에이처럼 사용할

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에 추가 할 수 있습니다.

관련 문제