我开始这样做是为了在我的视图中显示一些复选框:
@Html.LabelFor(m => m.MyEnum, T("Pick Your Poison"))
<div>
@for(int i = 0; i < Model.Alcohol.Count; i++)
{
<label>
@T(Model.Alcohol[i].Text)
@Html.CheckBoxFor(m => Model.Alcohol[i].Selected)
@Html.HiddenFor(m => Model.Alcohol[i].Value)
</label>
}
</div>
请注意:这里重要的是@T
方法,用于处理文本到其他语言的翻译。
这很有效。我有一个简单的enum
,后端的一些方法将它变成视图中的文本。所以,enum
如:
public enum MyEnum
{
Beer = 1,
Vodka = 2,
Rum = 3
}
将显示包含这3个选项的复选框列表。在我的ViewModel中,我这样做:
Alcohol= Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(x =>
{
return new SelectListItem {
Text = x.ToString().ToUpper(), Value = ((int)x).ToString()
};
}).ToList();
}
但是,我想在复选框旁边附上更多描述性文字。我宁愿enum
有这个或类似的系统(我会解释下划线):
public enum MyEnum
{
I_like_Beer = 1,
I_hate_Vodka = 2,
Meh__Rum = 3
}
我正在尝试创建一种去除下划线并用空格替换它的方法,如果是双下划线,请用逗号替换它,所以当显示复选框时,它们看起来像:
我喜欢啤酒
我讨厌伏特加
嗯,朗姆酒
但我不知道该怎么做。此外,我不确定这是最好的事情。我很想保留@T
功能,因为我可以轻松地在我的应用中翻译内容。否则,做任何其他事情都会对我造成伤害。
我应该做什么的任何例子?感谢。
答案 0 :(得分:5)
我喜欢使用数据注释来处理这类事情。这可以通过试图找出可变的可读文本约定来防止疯狂。
public enum MyEnum
{
[Description("I like beer")]
Beer = 1,
[Description("I hate vodka")]
Vodka = 2,
[Description("Meh, rum")]
Rum = 3
};
您可以使用reflection:
在运行时访问该值MyEnum sampleEnum = MyEnum.Beer;
var attr = typeof(MyEnum)
.GetMember(sampleEnum.ToString())
.First()
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.First() as DescriptionAttribute;
string description = attr.Description;
当然,这有点冗长(并且仍然需要错误处理),但您可以创建一个扩展方法来简化使用语法:
public static string GetDescriptionOrDefault<T>(this T enumValue, string defaultValue = null)
{
var attr = typeof(T)
.GetMember(enumValue.ToString())
.First()
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.FirstOrDefault() as DescriptionAttribute;
return attr == null ? (defaultValue ?? enumValue.ToString()) : attr.Description;
}
这将允许视图简单地写:
MyEnum sampleEnum = MyEnum.Beer;
string description = sampleEnum.GetDescriptionOrDefault();