.NET 7中实现数据库数据源下拉框(SelectListItem已弃用)
在ASP.NET Core 7中实现从数据库获取选项的下拉框(替代已弃用的SelectListItem)
1. 调整视图模型(DTO)
将原模型中List<SelectListItem>类型的Roles替换为SelectList类型,同时明确用于绑定选中值的属性:
public class AddUserRoleDto { public string Id { get; set; } public string SelectedRole { get; set; } // 绑定用户选择的角色值 public SelectList Roles { get; set; } // 存储下拉框选项数据源 }
2. 控制器构造下拉框数据源
从数据库(通过_roleManager)获取角色数据,直接构造SelectList对象,无需手动创建SelectListItem实例:
public IActionResult AddUserRole(string Id) { // 从数据库查询所有角色,提取名称作为选项的Value和Text var roleData = _roleManager.Roles.Select(r => new { r.Name }); // 构造SelectList:参数依次为数据源、值字段名、文本字段名 var roleSelectList = new SelectList(roleData, nameof(roleData.First().Name), nameof(roleData.First().Name)); return View(new AddUserRoleDto { Id = Id, Roles = roleSelectList }); }
可选:自定义选项类(更灵活的场景)
如果需要扩展选项的额外属性,可自定义一个选项类,再构造SelectList:
// 自定义角色选项类 public class RoleOption { public string Value { get; set; } public string Text { get; set; } // 可添加其他属性,比如Description等 } // 控制器中构造数据源 public IActionResult AddUserRole(string Id) { var roleOptions = _roleManager.Roles.Select(r => new RoleOption { Value = r.Name, Text = r.Name }).ToList(); var roleSelectList = new SelectList(roleOptions, nameof(RoleOption.Value), nameof(RoleOption.Text)); return View(new AddUserRoleDto { Id = Id, Roles = roleSelectList }); }
3. Razor视图渲染下拉框
使用ASP.NET Core的Tag Helper语法,强类型绑定下拉框的选中值和选项:
@model AddUserRoleDto <form asp-action="AddUserRole" method="post"> <input type="hidden" asp-for="Id" /> <div class="form-group"> <label asp-for="SelectedRole" class="control-label">选择角色</label> <select asp-for="SelectedRole" asp-items="@Model.Roles" class="form-control"></select> <span asp-validation-for="SelectedRole" class="text-danger"></span> </div> <button type="submit" class="btn btn-primary">保存角色</button> </form>
核心说明
SelectList是ASP.NET Core官方推荐的下拉框数据源类型,替代了已弃用的List<SelectListItem>用法,封装了选项的核心信息,使用更简洁。- Tag Helper的
asp-for和asp-items组合实现强类型绑定,避免硬编码,同时自动处理验证和选中状态。
内容的提问来源于stack exchange,提问作者rose
相关产品推荐
相关产品推荐

