尝试使用@ Html.CheckBox来显示枚举文本

时间:2013-08-24 04:23:10

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

我开始这样做是为了在我的视图中显示一些复选框:

@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功能,因为我可以轻松地在我的应用中翻译内容。否则,做任何其他事情都会对我造成伤害。

我应该做什么的任何例子?感谢。

1 个答案:

答案 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();