我有这样的枚举。
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"))
答案 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。