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

ASP.NET MVC中如何从控制器向视图展示枚举列表为下拉框

修复枚举下拉框显示问题

问题说明

现有DailyTask类包含Status枚举属性,期望在视图中展示包含「Select、Completed、InProgress、ToDo、Blocker」选项的下拉框,但当前视图显示的是文本框,无法正常选择枚举值。

错误原因分析

  1. 控制器中枚举值转换逻辑错误:用DailyTask类型遍历Status枚举值,导致枚举数据获取异常
  2. SelectList未正确配置Value和Name字段,且未添加默认的「Select」选项
  3. 视图中使用DropDownList未绑定到模型的对应属性,且初始化模型时错误地将Status赋值为ViewBag.EnumList
  4. 模型的Status属性为string类型,需确保下拉框选项值与枚举字符串匹配

修复步骤

1. 修改控制器代码

[HttpGet]
[Authorize]
public ActionResult AddDsr()
{
    using (Db db = new Db())
    {
        var uName = User.Identity.Name;
        User dto = db.Users.Where(x => x.Email == uName).FirstOrDefault();
        var id = dto.UserId;

        // 正确获取枚举值,转换为包含Value和Text的集合
        var enumData = Enum.GetValues(typeof(Status))
                           .Cast<Status>()
                           .Select(e => new 
                           {
                               Value = e.ToString(),
                               Text = e.ToString()
                           })
                           .ToList();
        // 添加默认的Select选项
        enumData.Insert(0, new { Value = "", Text = "Select" });

        ViewBag.EnumList = new SelectList(enumData, "Value", "Text");

        // 初始化模型时Status设为空字符串,而非ViewBag.EnumList
        List<DailyTask> ci = new List<DailyTask>
        {
            new DailyTask 
            { 
                Project = "", 
                Task = "", 
                Status = "", 
                UserId = id, 
                Email= uName,
                Date=DateTime.Today 
            } 
        };
        return View(ci);
    }
}

2. 修改视图代码

使用DropDownListFor绑定到模型的a[j].Status属性,确保下拉框与模型正确关联:

@if (Model != null && Model.Count > 0)
{
    int j = 0;
    foreach (var i in Model)
    {
        <tr style="border:1px solid black">
            <td>@Html.TextBoxFor(a => a[j].Project, new { @required="required"})</td>
            <td>@Html.TextBoxFor(a => a[j].Task, new { @required = "required" })</td>
            <td></td>
            <!-- 用DropDownListFor绑定到当前行的Status属性 -->
            <td>@Html.DropDownListFor(a => a[j].Status, ViewBag.EnumList as SelectList, new { @required = "required" })</td>
            <td>@Html.TextBoxFor(a => a[j].UserId, new { @class = "id", @type = "hidden" })</td>
            <td>@Html.TextBoxFor(a => a[j].Email, new { @class="email",@type="hidden"})</td>
            <td>@Html.TextBoxFor(a => a[j].Date, new { @type="hidden"})</td>
            <td></td>
            <td>
                @if (j > 0)
                {
                    <button class="remove btn btn-warning" id="delete">Remove</button>
                }
            </td>
        </tr>
        j++;
    }
}

3. 额外说明

  • 模型的Status属性为string类型,下拉框的Value设置为枚举的字符串值,确保提交时能正确绑定
  • 添加@required="required"属性可强制用户选择非默认选项
  • 若后续需要支持枚举的数字值,可将Value设为((int)e).ToString(),同时模型的Status属性改为int类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:32:36