.NET Core 2.0 Razor Pages中GetEnumSelectList生成空下拉框问题
解决ASP.NET Core 2.0 Razor Pages枚举填充下拉框为空的问题
嘿,我之前也碰到过一模一样的问题!在Razor Pages里用枚举生成下拉框却显示空白,多半是没把枚举正确转换成页面能识别的选项集合,或者页面绑定环节出了错。下面给你一步步的靠谱解决方案:
基础实现方案
1. 在PageModel中准备枚举选项集合
首先在你的PageModel类里,把枚举转换成SelectList,并在OnGet方法里完成初始化:
using System; using System.Linq; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; namespace EnumTest2 { public class IndexModel : PageModel { // 用于绑定用户选中的枚举值 public SomeEnum SelectedEnumValue { get; set; } // 下拉框的选项集合 public SelectList EnumSelectList { get; set; } public void OnGet() { // 将枚举转换为SelectListItem集合 var enumOptions = Enum.GetValues(typeof(SomeEnum)) .Cast<SomeEnum>() .Select(enumItem => new SelectListItem { Text = enumItem.ToString(), // 显示的文本 Value = ((int)enumItem).ToString() // 后台存储的枚举对应int值 }); // 初始化SelectList,指定Value和Text字段 EnumSelectList = new SelectList(enumOptions, "Value", "Text"); } } }
2. 在Razor页面中绑定下拉框
打开对应的.cshtml页面,用asp-for绑定选中值,asp-items绑定我们准备好的选项集合:
@page @model EnumTest2.IndexModel <div> <label>选择枚举选项:</label> <select asp-for="SelectedEnumValue" asp-items="Model.EnumSelectList"></select> </div>
这样运行起来,下拉框就会正确显示Test1、Test2、Test3三个选项了!
进阶:自定义枚举显示文本
如果你不想用枚举的默认名称(比如想把Test1改成「测试选项1」),可以给枚举加上DisplayNameAttribute,然后修改转换逻辑:
1. 给枚举添加自定义显示名
using System.ComponentModel; namespace EnumTest2 { public enum SomeEnum { [DisplayName("测试选项1")] Test1, [DisplayName("测试选项2")] Test2, [DisplayName("测试选项3")] Test3 } }
2. 修改PageModel中的转换逻辑
新增一个方法来获取枚举的DisplayName,然后更新选项集合的生成代码:
public void OnGet() { var enumOptions = Enum.GetValues(typeof(SomeEnum)) .Cast<SomeEnum>() .Select(enumItem => new SelectListItem { Text = GetEnumDisplayName(enumItem), Value = ((int)enumItem).ToString() }); EnumSelectList = new SelectList(enumOptions, "Value", "Text"); } // 自定义方法:获取枚举的DisplayName private string GetEnumDisplayName(SomeEnum enumItem) { var fieldInfo = enumItem.GetType().GetField(enumItem.ToString()); var displayAttr = fieldInfo.GetCustomAttributes(typeof(DisplayNameAttribute), false) .FirstOrDefault() as DisplayNameAttribute; // 如果没有设置DisplayName,就用枚举默认名称 return displayAttr?.DisplayName ?? enumItem.ToString(); }
常见坑点提醒
- 一定要确保在
OnGet(如果是Post请求,还要在OnPost里)初始化EnumSelectList,不然页面加载时选项集合为空,下拉框就会显示空白 - 页面中的
asp-items必须指向PageModel中已初始化的SelectList属性,注意名称拼写一致 - 如果是表单提交后重新加载页面,别忘了在
OnPost方法里重新生成选项集合,避免下拉框变空
内容的提问来源于stack exchange,提问作者Patrick Braunstorfer
相关产品推荐
相关产品推荐

