ASP.NET Core中SelectBox无法显示ViewData字典传递的数据如何解决
问题原因及修复方案
1. 绑定源写法不一致修正
你第一个下拉列表的asp-items属性使用了ViewBag.ProductGroupId取值,虽然ViewBag和ViewData底层共享数据,但动态类型解析存在转换失败的概率,建议统一使用ViewData的显式转换写法:
<!-- 修改前 --> <select asp-for="@Model.ProductGroupId" class="form-select me-2" asp-items="@(ViewBag.ProductGroupId as SelectList)"></select> <!-- 修改后 --> <select asp-for="@Model.ProductGroupId" class="form-select me-2" asp-items="@(ViewData["ProductGroupId"] as SelectList)"></select>
2. 检查SelectList构造参数匹配
确认_productServices.GetGroupsListItem()和GetSubGroups_ByGroupId_ListItem返回的集合元素,必须包含和构造参数完全匹配的Value、Text公共属性,如果是自定义类而非原生SelectListItem,要注意属性名大小写不能出错,否则SelectList会读取不到属性值,生成空下拉。
3. 补充空值预判逻辑
你控制器中直接调用groups.First().Value,如果分组集合为空会直接抛出异常,建议补充空值判断避免隐性错误:
[Microsoft.AspNetCore.Mvc.HttpGet] public IActionResult Create() { var groups = _productServices.GetGroupsListItem().ToList(); var subGroups = Enumerable.Empty<SelectListItem>(); if (groups.Any()) { subGroups = _productServices.GetSubGroups_ByGroupId_ListItem(int.Parse(groups.First().Value)).ToList(); } ViewData["ProductGroupId"] = new SelectList(groups, "Value", "Text"); ViewData["ProductSubGroupId"] = new SelectList(subGroups, "Value", "Text"); return View(); }
4. 检查命名空间引入
确认项目的_ViewImports.cshtml文件中已经引入了Microsoft.AspNetCore.Mvc.Rendering命名空间,否则Razor视图中SelectList的类型转换会失败,导致asp-items拿到空值,无法渲染选项。
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

