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

#asp.net-mvc-3 #attributes #enums

#asp.net-mvc-3 #атрибуты #перечисления

Вопрос:

в проекте MVC3 я использую перечисление с атрибутами отображения:

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

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

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

 public Foo FooProp { get; set; }
  

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

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

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

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

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

Ответ №1:

Может помочь пользовательский шаблон отображения ( ~/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
        }
    }
}
  

Комментарии:

1. Думаю, это должно быть ‘если (display.Name . Длина > 0)’. У DisplayAttribute нет свойства Length.

2. FirstOrDefault() может возвращать значение NULL (атрибут отсутствует), поэтому вы также должны это проверить!

3. Может ли это быть общий шаблон типа перечисления?

Ответ №2:

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

ПРИМЕЧАНИЕ: Этот код не полагается на @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>