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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:33:28