如何在Engine.Razor.RunCompile中显示枚举的EnumMember属性值
解决Razor渲染枚举时显示EnumMember友好名称的问题
我明白你遇到的困扰了——Razor默认会直接调用枚举的ToString()方法,所以显示的是带下划线的成员名,而非EnumMember特性指定的友好名称。下面给你几个实用的解决方案:
1. 编写枚举扩展方法获取友好名称
这是最直接的方式,写一个通用的扩展方法来提取EnumMember的Value值:
using System; using System.Linq; using System.Reflection; using System.Runtime.Serialization; public static class EnumExtensions { // 获取EnumMember指定的友好名称 public static string GetFriendlyName(this Enum enumValue) { // 获取枚举成员的反射信息 var memberInfo = enumValue.GetType() .GetMember(enumValue.ToString()) .FirstOrDefault(); if (memberInfo == null) { return enumValue.ToString(); } // 提取EnumMember特性的Value var enumMemberAttr = memberInfo.GetCustomAttribute<EnumMemberAttribute>(); return enumMemberAttr?.Value ?? enumValue.ToString(); } }
之后在你的CSHTML文件里,直接调用这个扩展方法即可:
<!-- 显示单个枚举值的友好名称 --> @Model.YourNutritionalRequirementProperty.GetFriendlyName()
2. 生成带友好名称的下拉列表(表单场景)
如果需要在下拉列表中展示友好名称,可以再写一个扩展方法生成SelectListItem集合:
public static IEnumerable<SelectListItem> ToFriendlySelectList<TEnum>(this TEnum enumValue) where TEnum : Enum { return Enum.GetValues(typeof(TEnum)) .Cast<TEnum>() .Select(item => new SelectListItem { Text = item.GetFriendlyName(), // 使用上面的扩展方法 Value = item.ToString() }); }
在CSHTML中使用:
@Html.DropDownListFor(m => m.NutritionalRequirement, Model.NutritionalRequirement.ToFriendlySelectList())
3. 自定义Enum显示模板(全局生效)
如果你希望所有枚举类型在Razor中都自动显示友好名称,可以创建一个全局的显示模板:
- 在
Views/Shared/DisplayTemplates文件夹下创建Enum.cshtml文件(文件夹不存在就新建) - 写入以下内容:
@model Enum @Model.GetFriendlyName()
之后使用DisplayFor时会自动套用这个模板:
@Html.DisplayFor(m => m.NutritionalRequirement)
关于Json序列化/反序列化的问题
你提到用StringEnumConverter序列化能得到正确值,但反序列化后变回下划线形式——其实可以配置转换器让它正确识别EnumMember的Value。确保你的Json序列化配置是这样的:
var jsonSettings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new StringEnumConverter { // 确保使用EnumMember的Value进行序列化/反序列化 NamingStrategy = null, AllowIntegerValues = false } } }; // 序列化 var jsonString = JsonConvert.SerializeObject(yourModel, jsonSettings); // 反序列化 var deserializedModel = JsonConvert.DeserializeObject<YourModel>(jsonString, jsonSettings);
这样配置后,反序列化时就能把"Mechanical Soft"正确映射到Mechanical_Soft枚举成员了。
内容的提问来源于stack exchange,提问作者Steven Zack
相关产品推荐
相关产品推荐

