如何在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
相关产品推荐
相关产品推荐

