ASP.NET MVC中如何从控制器向视图展示枚举列表为下拉框
修复枚举下拉框显示问题
问题说明
现有DailyTask类包含Status枚举属性,期望在视图中展示包含「Select、Completed、InProgress、ToDo、Blocker」选项的下拉框,但当前视图显示的是文本框,无法正常选择枚举值。
错误原因分析
- 控制器中枚举值转换逻辑错误:用
DailyTask类型遍历Status枚举值,导致枚举数据获取异常 SelectList未正确配置Value和Name字段,且未添加默认的「Select」选项- 视图中使用
DropDownList未绑定到模型的对应属性,且初始化模型时错误地将Status赋值为ViewBag.EnumList - 模型的
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
相关产品推荐
相关产品推荐

