0

我有这样的枚举。

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

我使用 ASP MVC4 在这样的下拉列表中显示选择。

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

这就像一个魅力,它在下拉列表中显示男人/女人。我的问题是我想在不同的上下文中在这些枚举上显示不同的名称。

就像你是妈妈或爸爸的情况一样。我想使用性别枚举作为基础,但显示 Mom/Dad instad of Man/Woman。

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

这有可能吗?

编辑 我使用了凯文的解决方案,还添加了另一种这样的扩展方法。

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"))
4

3 回答 3

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());
    }
}
于 2013-08-30T14:45:59.907 回答
1

尝试为您的枚举添加扩展类。这是这个类的一个例子。

 
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;
    }
}
于 2013-08-30T14:01:49.677 回答
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 中。

于 2013-08-30T14:10:45.620 回答