ASP.NET Core中C#实现数据库源下拉列表及SelectListItem过时问题
在ASP.NET Core中实现从数据库获取数据的下拉列表(解决SelectListItem过时问题)
一、定义视图模型(DTO)
先保留你的AddUserRoleDto,注意引用Microsoft.AspNetCore.Mvc.Rendering命名空间来使用SelectListItem:
using Microsoft.AspNetCore.Mvc.Rendering; public class AddUserRoleDto { public string Id { get; set; } public string Role { get; set; } public List<SelectListItem> Roles { get; set; } }
二、控制器中从数据库获取数据并构建下拉选项(修正过时写法)
如果你的代码里new SelectListItem { Text = ..., Value = ... }被提示过时,推荐用官方提供的静态方法SelectListItem.Create()创建实例,或者用SelectList类简化代码:
方式1:使用SelectListItem.Create()(解决过时提示)
public IActionResult AddUserRole(string Id) { // 从RoleManager读取数据库角色数据,转换为SelectListItem集合 var roleList = _roleManager.Roles .Select(p => SelectListItem.Create(p.Name, p.Name)) .ToList(); return View(new AddUserRoleDto { Id = Id, Roles = roleList }); }
方式2:使用SelectList类(更简洁)
你也可以把DTO中的Roles改为SelectList类型,直接用SelectList构建数据源:
// 修改后的DTO public class AddUserRoleDto { public string Id { get; set; } public string Role { get; set; } public SelectList Roles { get; set; } } // 控制器代码 public IActionResult AddUserRole(string Id) { // 直接用SelectList绑定数据源,指定显示文本和值的字段名 var roleSelectList = new SelectList(_roleManager.Roles, "Name", "Name"); return View(new AddUserRoleDto { Id = Id, Roles = roleSelectList }); }
三、在Razor视图中渲染下拉列表
用ASP.NET Core标签助手渲染强类型下拉列表,确保视图绑定到AddUserRoleDto:
@model AddUserRoleDto <div class="form-group"> <label asp-for="Role" class="control-label">选择角色</label> <!-- asp-for绑定DTO的Role属性,asp-items绑定下拉选项 --> <select asp-for="Role" asp-items="@Model.Roles" class="form-control"> <option value="">请选择角色</option> </select> <span asp-validation-for="Role" class="text-danger"></span> </div>
关键说明
- 解决
SelectListItem过时提示,优先用SelectListItem.Create()静态方法,这是ASP.NET Core后续版本推荐的实例创建方式,避免直接对象初始化的警告。 - 确保控制器已正确注入
RoleManager<IdentityRole>,用于从数据库读取角色数据。
内容的提问来源于stack exchange,提问作者rose
相关产品推荐
相关产品推荐

