You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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中都自动显示友好名称,可以创建一个全局的显示模板:

  1. 在Views/Shared/DisplayTemplates文件夹下创建Enum.cshtml文件(文件夹不存在就新建)
  2. 写入以下内容:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:11:10