如何在ASP.NET Core视图中显示枚举的DisplayName并支持选择性展示?
解决方案
1. 新增枚举DisplayName扩展方法
先实现一个工具方法,用于读取枚举值对应的Display属性名称:
public static class EnumExtensions { public static string GetDisplayName(this Enum enumValue) { return enumValue.GetType() .GetMember(enumValue.ToString()) .FirstOrDefault()? .GetCustomAttribute<DisplayAttribute>()? .Name ?? enumValue.ToString(); } }
2. 修改控制器逻辑
不再直接使用Enum.GetNames,而是遍历枚举所有值,提取每个值的DisplayName和对应枚举值,构建可用于视图的选项集合:
public IActionResult Index() { var smsTypeOptions = Enum.GetValues(typeof(SmsType)) .Cast<SmsType>() .Select(t => new SelectListItem { Text = t.GetDisplayName(), Value = ((int)t).ToString() }); ViewBag.SmsType = smsTypeOptions; return View(); }
注:Value字段可根据需求选择枚举数值或枚举名称,上述示例用的是数值。
3. 视图中渲染下拉选择框
方式一:使用Html辅助方法
@Html.DropDownList("SmsType", (IEnumerable<SelectListItem>)ViewBag.SmsType, "请选择短信类型", new { @class = "form-control" })
第三个参数为默认空选项文本,可根据需求修改或移除。
方式二:使用TagHelper(ASP.NET Core推荐)
<select asp-for="SelectedSmsType" asp-items="@(ViewBag.SmsType as IEnumerable<SelectListItem>)" class="form-control"> <option value="">请选择短信类型</option> </select>
使用该方式需确保模型中存在SelectedSmsType属性(类型可为SmsType?或int)。
4. 实现选择性展示枚举项
若需仅展示部分枚举值,可在构建选项集合时添加筛选条件,例如排除Standard项:
var smsTypeOptions = Enum.GetValues(typeof(SmsType)) .Cast<SmsType>() .Where(t => t != SmsType.Standard) .Select(t => new SelectListItem { Text = t.GetDisplayName(), Value = ((int)t).ToString() });
也可根据业务逻辑动态筛选,比如从配置读取允许展示的枚举值列表。
内容的提问来源于stack exchange,提问作者rose
相关产品推荐
相关产品推荐

