我的模型中有一个属性,称为Promotion它的类型是一个标志枚举,称为UserPromotion. 我的枚举成员的显示属性设置如下:
Promotion
UserPromotion
[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 }
现在我希望能够在我的视图中创建say a来显示我的属性ul的选定值。Promotion这是我到目前为止所做的,但问题是我怎样才能在这里获得显示名称?
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>
更新
第一个解决方案的重点是从枚举中获取显示名称。下面的代码应该是您问题的确切解决方案。
您可以将此辅助类用于枚举:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; public static class EnumHelper<T> where T : struct, Enum // This constraint requires C# 7.3 or later. { public static IList<T> GetValues(Enum value) { var enumValues = new List<T>(); foreach (FieldInfo fi in value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)) { enumValues.Add((T)Enum.Parse(value.GetType(), fi.Name, false)); } return enumValues; } public static T Parse(string value) { return (T)Enum.Parse(typeof(T), value, true); } public static IList<string> GetNames(Enum value) { return value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public).Select(fi => fi.Name).ToList(); } public static IList<string> GetDisplayValues(Enum value) { return GetNames(value).Select(obj => GetDisplayValue(Parse(obj))).ToList(); } private static string lookupResource(Type resourceManagerProvider, string resourceKey) { var resourceKeyProperty = resourceManagerProvider.GetProperty(resourceKey, BindingFlags.Static | BindingFlags.Public, null, typeof(string), new Type[0], null); if (resourceKeyProperty != null) { return (string)resourceKeyProperty.GetMethod.Invoke(null, null); } return resourceKey; // Fallback with the key name } public static string GetDisplayValue(T value) { var fieldInfo = value.GetType().GetField(value.ToString()); var descriptionAttributes = fieldInfo.GetCustomAttributes( typeof(DisplayAttribute), false) as DisplayAttribute[]; if (descriptionAttributes[0].ResourceType != null) return lookupResource(descriptionAttributes[0].ResourceType, descriptionAttributes[0].Name); if (descriptionAttributes == null) return string.Empty; return (descriptionAttributes.Length > 0) ? descriptionAttributes[0].Name : value.ToString(); } }
然后你可以在你的视图中使用它,如下所示:
<ul> @foreach (var value in @EnumHelper<UserPromotion>.GetValues(UserPromotion.None)) { if (value == Model.JobSeeker.Promotion) { var description = EnumHelper<UserPromotion>.GetDisplayValue(value); <li>@Html.DisplayFor(e => description )</li> } } </ul>
希望能帮助到你!:)