В моей модели есть свойство «Поощрение», типом которого является перечисление флага «UserPromotion». Члены моего enum имеют атрибуты отображения, установленные следующим образом:
[Flags]
public enum UserPromotion
{
None = 0x0,
[Display(Name = "Send Job Offers By Mail")]
SendJobOffersByMail = 0x1,
[Display(Name = "Send Job Offers By Sms")]
SendJobOffersBySms = 0x2,
[Display(Name = "Send Other Stuff By Sms")]
SendPromotionalBySms = 0x4,
[Display(Name = "Send Other Stuff By Mail")]
SendPromotionalByMail = 0x8
}
Теперь я хочу иметь возможность создать, скажем, ul на мой взгляд, чтобы показать выбранные значения моего свойства «Продвижение». Это то, что я сделал до сих пор, но проблема в том, как я могу получить отображаемые имена здесь?
<ul>
@foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
{
var currentPromotion = (int)Model.JobSeeker.Promotion;
if ((currentPromotion & aPromotion) == aPromotion)
{
<li>Here I don't know how to get the display attribute of "currentPromotion".</li>
}
}
</ul>
c#
asp.net-mvc
razor
displayattribute
Pejman
источник
источник
System.ComponentModel.DataAnnotations.DisplayAttribute
. НеSystem.ComponentModel.DisplayNameAttribute
.Ответы:
ОБНОВИТЬ
Первое решение было сосредоточено на получении отображаемых имен из enum. Код ниже должен быть точным решением вашей проблемы.
Вы можете использовать этот вспомогательный класс для перечислений:
И тогда вы можете использовать его на ваш взгляд следующим образом:
Надеюсь, поможет! :)
источник
.ToString
, но от stackoverflow.com/q/483794/179311 , он говорит, чтобы использоватьEnum.GetName
вместо.GetDisplayValue
вас должен первый тест ,descriptionAttributes == null
прежде чем пытаться получить доступ к массиву:descriptionAttributes[0]
. В противном случае вы можете вызвать исключение, и строка ниже, где вы проверяете нулевое значение, никогда не будет истинной.Один вкладыш - Свободный синтаксис
пример
Вывод
источник
.NET Framework 4.5
и что вы включаете следующие пространства именSystem.Net
System.ComponentModel.DataAnnotations
GetAttribute<TAttribute>
ужасное соглашение об именах? Он извлекает указанный вами атрибут и использует регистр паскаля, как и все открытые методы.Основываясь на отличном ответе Айдына , вот метод расширения, который не требует никаких параметров типа.
ПРИМЕЧАНИЕ. GetName () следует использовать вместо свойства Name. Это гарантирует, что локализованная строка будет возвращена при использовании свойства атрибута ResourceType.
пример
Чтобы использовать его, просто укажите значение enum в вашем представлении.
Вывод
Промоушен: отправка вакансий по почте
источник
@Html.DisplayFor(m => m.myEnum.GetDisplayName())
, который не будет работать, потому что они ожидают, что вычисленное выражение выдаст свойство или что-то подобное. Вы должны использовать значение перечисления чуть-чуть, как в примере выше.GetCustomAttribute<DisplayAttribute>()
потому что для некоторых Enums это может отсутствовать. Это возвращается к,enumValue.ToString()
если DisplayAttribute не присутствовал.List<SelectListItem>
объекта Enum со всеми индивидуальнымиDisplayAttribute.Name
аннотациями - это сработало отлично, спасибо!public List<SelectListItem> MySelectListItem = new List<SelectListItem>(); foreach (MyEnum MyEnum in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Where(x => x != MyEnum.Default)) { MySelectListItem.Add(new SelectListItem() { Text = MyEnum.GetDisplayName(), Value = ((int)MyEnum).ToString() }); }
Основываясь на ответе Айдына, я бы предложил менее «дублирующую» реализацию (потому что мы могли бы легко получить
Type
самоEnum
значение вместо предоставления его в качестве параметра parameter:РЕДАКТИРОВАТЬ (на основе комментария @Vahagn Nahapetyan)
Теперь мы можем использовать его очень чисто:
Что приводит к
источник
this
должно быть допустимое (не нулевое) значение Enum. В противном случае вызов метода уже приведет к выбросу (что является обязанностью вызывающего кода). ЭтоGetType()
обязательно обеспечит правильный тип Enum, в которомenumvalue
наверняка будет член. Но GetCustomAttribute может возвращать нулевое значение, поэтому я предоставил неисключительную версию метода для возврата нулевого значения, когда цепочка вызовов методов где-либо имеет нулевое возвращаемое значение. Спасибо!Если вы используете MVC 5.1 или выше, есть более простой и понятный способ: просто используйте аннотацию данных (из
System.ComponentModel.DataAnnotations
пространства имен), как показано ниже:И, видимо, просто поместите его в правильный помощник HTML:
источник
Вы можете использовать метод Type.GetMember , а затем получить информацию об атрибуте, используя отражение:
Здесь было несколько похожих постов:
Получение атрибутов значения Enum
Как заставить MVC3 DisplayFor показывать значение атрибута отображения Enum?
источник
Основываясь на великолепном ответе Тодда, основанном на отличном ответе Айдына , вот общий метод расширения, который не требует никаких параметров типа.
Мне это нужно для моего проекта, потому что что-то вроде приведенного ниже кода, где не каждый член перечисления имеет
DisplayAttribute
, не работает с решением Тодда:Если это сложное решение простой проблемы, пожалуйста, дайте мне знать, но это было исправление, которое я использовал.
источник
источник
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
У меня есть два решения этого вопроса.
источник
Для ASP.Net Core 3.0 это сработало для меня (благодарность предыдущим авторам).
Мой Enum класс:
Мой вид модели класса:
Пример вида бритвы с отображением метки и раскрывающегося списка. Обратите внимание, что раскрывающийся список не требует вспомогательного метода:
источник
Вам нужно использовать немного отражения для доступа к этому атрибуту:
Я рекомендую обернуть этот метод в метод расширения или выполнить его в модели представления.
источник
С Core 2.1,
источник
объединяя все граничные случаи сверху:
Equals
,ToString
)Display
атрибутвот мой код:
источник
Мне жаль это делать, но я не мог использовать другие ответы как есть и не успел выяснить это в комментариях.
Использует синтаксис C # 6.
источник
Основываясь на ответах Айдына и Тодда, вот метод расширения, который также позволяет вам получить имя из файла ресурсов.
и использовать его как
источник
Я хочу внести свой вклад с зависимым от культуры расширением перечисления GetDisplayName. Надеюсь, что это будет полезно для тех, кто ищет этот ответ, как я ранее:
«Стандартный» путь, как отметили Айдын Адн и Тодд :
«Культурно-зависимый» способ:
источник
Обновление 2020: обновленная версия функции, предоставленной многими в этой теме, но теперь для C # 7.3 и далее:
Теперь вы можете ограничить универсальные методы перечислениями, чтобы вы могли написать единственное расширение метода, чтобы использовать его со всеми перечислениями следующим образом:
Общий метод расширения:
Перечисление:
Как это использовать:
Бонус, перечисления с флагами: если вы имеете дело с обычными перечислениями, вышеуказанной функции достаточно, но если любое из ваших перечислений может принимать несколько значений с использованием флагов, вам нужно будет изменить его следующим образом (этот код использует C # 8 функции):
Перечисление с флагами:
Как это использовать:
источник
На основе предыдущих ответов я создал этот удобный помощник для поддержки всех свойств DisplayAttribute в удобочитаемой форме:
источник
Я пытался сделать это как редактирование, но оно было отклонено; Я не понимаю почему.
Выше приведено исключение, если вы вызываете его с помощью Enum, который имеет сочетание пользовательских атрибутов и простых элементов, например
Поэтому я немного изменил код, чтобы проверять наличие пользовательских атрибутов, прежде чем пытаться получить к ним доступ, и использовать имя, если ни одного не найдено.
источник
Используя MVC5 вы можете использовать:
тогда, если вы хотите создать выпадающий селектор, вы можете использовать:
источник