枚举有多个描述

时间:2013-08-30 13:43:49

标签: c# asp.net asp.net-mvc asp.net-mvc-4 enums

我有这样的枚举。

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

我使用ASP MVC4在下拉列表中显示选项。

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

这就像一个魅力,它在下拉中显示男人/女人。 我的问题是,我希望在不同的上下文中显示不同的名称。

如果你是一个妈妈或一个爸爸,就像一个背景一样。我想使用性别枚举作为基础,但显示男/女的妈妈/爸爸。

另一个背景是男孩/女孩,我仍然想使用性别枚举,但显示不同的文字。

这有可能吗?

修改 我使用了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"))

3 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分:1)

尝试为您的Enum添加Extensions类。这是这个类的一个例子。

 
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;
    }
}

答案 2 :(得分:0)

Dunno,如果这是最好的方式,但是如何:

@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'是另一个Enum。

显然你不需要在页面功能中使用这些功能 - 可以在进入视图之前将项目列表添加到ViewBag。