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

如何在ASP.NET MVC表格中显示枚举的Display名称?

解决枚举Display名称在列表视图中显示的问题

问题原因

你的Table_User模型中IsAdmin和IsActive字段为int类型,直接输出时只会显示数据库存储的整数值,无法自动关联枚举定义的Display特性名称。

解决方案

方案1:用扩展方法统一获取枚举Display名称

先在项目中添加一个通用扩展方法类,用来从枚举值(或对应int值)中提取Display特性的名称:

using System.ComponentModel.DataAnnotations;
using System.Reflection;

public static class EnumExtensions
{
    // 针对枚举值的扩展方法
    public static string GetDisplayName(this Enum enumValue)
    {
        return enumValue.GetType()
                        .GetMember(enumValue.ToString())
                        .FirstOrDefault()?
                        .GetCustomAttribute<DisplayAttribute>()?
                        .Name ?? enumValue.ToString();
    }

    // 针对int值的重载,直接传入int和枚举类型
    public static string GetDisplayNameFromInt<TEnum>(this int enumIntValue) where TEnum : Enum
    {
        if (Enum.IsDefined(typeof(TEnum), enumIntValue))
        {
            var enumValue = (Enum)Enum.ToObject(typeof(TEnum), enumIntValue);
            return enumValue.GetDisplayName();
        }
        return enumIntValue.ToString();
    }
}

然后在列表视图中调用该方法:

@using LibraryManagementSystem.Models
@using LibraryManagementSystem.Enums
@using 你的项目命名空间.Helpers <!-- 替换为扩展方法所在的命名空间 -->
@model List<Table_User>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>用户列表</h2>
<table class="table table-bordered">
    <tr>
        <th>账号状态</th>
        <th>用户角色</th>
        <th>操作</th>
    </tr>
    @foreach (var item in Model)
    {
<tr>
    <td>@item.IsActive.GetDisplayNameFromInt<IsActive>()</td>
    <td>@item.IsAdmin.GetDisplayNameFromInt<IsAdmin>()</td>
    <td>
        <a href="/Admin/UserUpdate/@item.UserID" class="btn btn-danger">修改</a>
    </td>
</tr>
    }
</table>

方案2:视图内直接转换并获取名称

如果不想新增扩展方法,可在视图内定义局部方法实现转换:

@using LibraryManagementSystem.Models
@using LibraryManagementSystem.Enums
@using System.ComponentModel.DataAnnotations
@using System.Reflection
@model List<Table_User>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    // 局部方法:根据int值和枚举类型获取Display名称
    string GetEnumDisplayName(int value, Type enumType)
    {
        if (Enum.IsDefined(enumType, value))
        {
            var enumValue = Enum.ToObject(enumType, value);
            var memberInfo = enumType.GetMember(enumValue.ToString()).FirstOrDefault();
            return memberInfo?.GetCustomAttribute<DisplayAttribute>()?.Name ?? enumValue.ToString();
        }
        return value.ToString();
    }
}

<h2>用户列表</h2>
<table class="table table-bordered">
    <tr>
        <th>账号状态</th>
        <th>用户角色</th>
        <th>操作</th>
    </tr>
    @foreach (var item in Model)
    {
<tr>
    <td>@GetEnumDisplayName(item.IsActive, typeof(IsActive))</td>
    <td>@GetEnumDisplayName(item.IsAdmin, typeof(IsAdmin))</td>
    <td>
        <a href="/Admin/UserUpdate/@item.UserID" class="btn btn-danger">修改</a>
    </td>
</tr>
    }
</table>

方案3:修改模型字段类型(推荐)

如果业务允许,直接将Table_User模型中的IsAdmin和IsActive字段类型从int改为对应枚举类型,EF会自动处理int与枚举的映射:

public class Table_User
{
    // 其他字段...
    public IsAdmin IsAdmin { get; set; }
    public IsActive IsActive { get; set; }
}

之后在视图中直接调用方案1的扩展方法即可:

<td>@item.IsActive.GetDisplayName()</td>
<td>@item.IsAdmin.GetDisplayName()</td>

这种方式符合强类型编程规范,避免手动转换的繁琐。


内容的提问来源于stack exchange,提问作者user17847724

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:45:56