ASP.NET Core 5 MVC中使用EF Core从数据库生成下拉列表的报错求助
问题根因
你触发报错的核心原因是:控制器返回给视图的模型是IEnumerable<Bdgfixmonth>集合类型,但你在视图中直接调用Model.Years,集合类型本身没有定义Years属性,只有单个Bdgfixmonth实体才有该属性,因此触发了编译错误。
修复方案
按以下步骤调整即可同时满足下拉框填充、按年份筛选的需求:
1. 新增视图模型
不要直接用数据库实体类作为视图模型,新增专门的视图模型承载下拉框选项、筛选值、展示数据三类内容:
public class BdgfixmonthViewModel { // 存储用户选中的年份 public int? SelectedYear { get; set; } // 下拉框用的年份选项列表 public IEnumerable<SelectListItem> Years { get; set; } // 展示用的业务数据列表 public IEnumerable<Bdgfixmonth> Bdgfixmonths { get; set; } }
注意:可以删除原
Bdgfixmonth实体类中的Years属性,数据库实体不需要承载视图相关的字段,避免EF Core映射报错。
2. 调整控制器Index方法
改造后支持首次加载全量数据、选中年份后筛选数据的逻辑:
public async Task<IActionResult> Index(int? selectedYear) { // 查询所有年份并去重,避免下拉框出现重复选项 var allYears = await _context.Bdgfixmonths .Select(x => x.Byear) .Distinct() .ToListAsync(); // 构造下拉框选项,选中值与传入的筛选值同步 var yearOptions = allYears.Select(y => new SelectListItem { Text = y.ToString(), Value = y.ToString(), Selected = y == selectedYear }); // 按选中年份筛选数据,无选中值则返回全量 var dataQuery = _context.Bdgfixmonths.AsQueryable(); if (selectedYear.HasValue) { dataQuery = dataQuery.Where(x => x.Byear == selectedYear.Value); } var dataList = await dataQuery.ToListAsync(); // 组装视图模型返回 var viewModel = new BdgfixmonthViewModel { SelectedYear = selectedYear, Years = yearOptions, Bdgfixmonths = dataList }; return View(viewModel); }
3. 调整视图代码
首先在视图顶部指定绑定的模型类型,再修改下拉框逻辑,增加筛选提交入口:
@* 顶部声明绑定的视图模型 *@ @model BdgfixmonthViewModel @* 下拉框包裹在表单中,选中后提交即可触发筛选 *@ <form asp-action="Index" method="get"> @Html.DropDownListFor(m => m.SelectedYear, Model.Years, "-- Select year --") <button type="submit">查询</button> </form> @* 下方展示筛选后的业务数据 *@ @foreach (var item in Model.Bdgfixmonths) { <div> 年份:@item.Byear 月份:@item.Bmonth 预算:@item.Bbudget </div> }
内容的提问来源于stack exchange,提问作者chdev
相关产品推荐
相关产品推荐

