#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>