在WebGrid中获取Enum DisplayName

时间:2014-03-14 03:00:11

标签: c# asp.net-mvc webgrid

我有一个WebGrid,它在一列中显示Status枚举。有几个枚举成员由两个单词组成,我想使用枚举的DisplayName属性而不是默认的ToString()表示,例如“OnHold”应显示为“暂停”。

@grid.GetHtml(
    tableStyle: "webGrid",
    headerStyle: "header",
    alternatingRowStyle: "alt",
    mode: WebGridPagerModes.All,
    columns: grid.Columns(
        grid.Column("JobId", "Job ID"),
        grid.Column("Status", "Status", item =>
        {
            return ModelMetadata
                       .FromLambdaExpression(**What goes in here**)
                       .DisplayName;
        }),
        grid.Column("OutageType", "Outage Type"),

我是否可以通过某种方式使用模型元数据获取此信息?

2 个答案:

答案 0 :(得分:3)

我们遇到了同样的问题。我最终通过制作以下HtmlHelper扩展来解决它:

    public static MvcHtmlString DisplayName(this HtmlHelper html, object value)
    {
        var displayAttributes = (DisplayAttribute[])value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DisplayAttribute), false);
        if (displayAttributes == null || displayAttributes.Length == 0)
        {
            return new MvcHtmlString(value.ToString());
        }
        return new MvcHtmlString(displayAttributes[0].Name);
    }

该列可以像:

    grid.Column("Status", "Status", item => Html.DisplayName(item.Status)),

编辑:对于全球化,更改" displayAttributes [0] .Name" to" displayAttributes [0] .GetName()"。

答案 1 :(得分:0)

我面前没有VS,但也许你可以尝试一下......

[TypeConverter(typeof(PascalCaseWordSplittingEnumConverter))]

查看this article如何在下拉列表中使用它。