Как заставить MVC3 DisplayFor отображать значение атрибута отображения Enum?

В MVC3-проекте я использую перечисление с display-Attributes:

public enum Foo {
  [Display(Name = "Undefined")]
  Undef = 0,

  [Display(Name = "Fully colored")]
  Full = 1
}

У класса модели есть свойство, использующее это перечисление:

public Foo FooProp { get; set; }

Представление использует класс модели и отображает свойство через

@Html.DisplayFor(m => m.FooProp)

Теперь, наконец, мой вопрос:

Как я могу заставить.DisplayFor() показывать строку из Display-Attribute вместо того, чтобы показывать только имя-значения перечисления? (должно отображаться "Не определено" или "Полностью окрашено", но отображается "Undef" или "Полный").

Спасибо за советы!

2 ответа

Решение

Пользовательский шаблон отображения может помочь (~/Views/Shared/DisplayTemplates/Foo.cshtml):

@using System.ComponentModel.DataAnnotations
@model Foo

@{
    var field = Model.GetType().GetField(Model.ToString());
    if (field != null)
    {
        var display = ((DisplayAttribute[])field.GetCustomAttributes(typeof(DisplayAttribute), false)).FirstOrDefault();
        if (display != null)
        {
            @display.Name
        }
    }
}

Другое решение

ПРИМЕЧАНИЕ. Этот код не зависит от @Html.DisplayFor()

Я сделал это так...

      using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;

namespace Nilhoor.Utility.Extensions
{
    public static class EnumExtensions
    {
        .
        .
        .

        public static string GetDisplayName(this Enum @enum)
        {
            var memberName = @enum.ToString();
            
            var nameAttribute = @enum.GetType().GetMember(memberName).FirstOrDefault()?.GetCustomAttribute<DisplayAttribute>();
            
            return nameAttribute != null 
                ? nameAttribute.GetName() 
                : memberName;
        }
    }
}

В x.cshtml

      @using Nilhoor.Utility.Extensions
.
.
.
<span>Value: </span>
<span>@Model.Type.GetDisplayName()</span>
Другие вопросы по тегам