如何找到相应值的枚举名称并在DisplayFor中使用它?

Cri*_*ano 5 asp.net asp.net-mvc enums razor asp.net-mvc-4

我需要在DisplayFor HtmlHelper中显示枚举的名称以获得相应的值.我有以下枚举:

public enum CheckStatus
    {
        Yes = 1,
        No = 2,
        Maybe =3
    }
Run Code Online (Sandbox Code Playgroud)

我正在显示通常像这样的模型的值:

@Html.DisplayFor(modelItem => item.Name)
Run Code Online (Sandbox Code Playgroud)

问题是,我有一点:

@Html.DisplayFor(modelItem => item.Status)
Run Code Online (Sandbox Code Playgroud)

该行仅显示从枚举(1,2或3)之前设置的状态值.而不是我需要以某种方式显示该值的名称.因此,如果状态代码为2,我想显示"否",而不是数字2.

当我填充下拉列表时,我遇到了与枚举名称类似的问题,我设法解决了这个问题:

@Html.DropDownListFor(model => model.Item.Status,
                new SelectList(Enum.GetValues(typeof(Pro.Web.Models.Enums.CheckStatus))))
Run Code Online (Sandbox Code Playgroud)

我对如何从枚举值中只得到一个名称感到有点迷茫.

谢谢您的帮助.

Dar*_*rov 8

从你的问题来看,这个Status属性的基本类型不是很清楚.如果是CheckStatus,那么@Html.DisplayFor(modelItem => item.Status)将完全显示您的期望.另一方面,如果它是一个整数,您可以编写一个自定义帮助程序来显示正确的值:

public static class HtmlExtensions
{
    public static IHtmlString DisplayEnumFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, int>> ex, Type enumType)
    {
        var value = (int)ModelMetadata.FromLambdaExpression(ex, html.ViewData).Model;
        string enumValue = Enum.GetName(enumType, value);
        return new HtmlString(html.Encode(enumValue));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

@Html.DisplayEnumFor(modelItem => item.Status, typeof(CheckStatus))
Run Code Online (Sandbox Code Playgroud)

让我们假设你想让这个助手更进一步,并考虑你的枚举类型的DisplayName属性:

public enum CheckStatus
{
    [Display(Name = "oh yeah")]
    Yes = 1,
    [Display(Name = "no, no, no...")]
    No = 2,
    [Display(Name = "well, dunno")]
    Maybe = 3
}
Run Code Online (Sandbox Code Playgroud)

以下是扩展我们的自定义助手的方法:

public static class HtmlExtensions
{
    public static IHtmlString DisplayEnumFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, int>> ex, Type enumType)
    {
        var value = (int)ModelMetadata.FromLambdaExpression(ex, html.ViewData).Model;
        string enumValue = Enum.GetName(enumType, value);
        var field = enumType.GetField(enumValue);
        if (field != null)
        {
            var displayAttribute = field
                .GetCustomAttributes(typeof(DisplayAttribute), false)
                .Cast<DisplayAttribute>()
                .FirstOrDefault();
            if (displayAttribute != null)
            {
                return new HtmlString(html.Encode(displayAttribute.Name));
            }
        }
        return new HtmlString(html.Encode(enumValue));
    }
}
Run Code Online (Sandbox Code Playgroud)