在.NET 5.0 C# Razor中动态填充<select>下拉列表仅显示最后一个数据库值的问题排查
问题根源分析与修复方案
兄弟,我一眼就看穿问题所在了——你在Controller的循环里犯了一个典型的覆盖赋值错误,同时获取国家列表的逻辑也存在严重的冗余,导致下拉列表只显示最后一个值,还拖慢了查询速度。
1. 为什么下拉列表只剩最后一个值?
看你Controller里的这段循环代码:
for (int i = 0; i < 195; i++) { try { CountryList = new SelectListItem[] { new SelectListItem(countriesList[i], countriesList[i]) }; } catch { break; } }
每次循环你都重新创建了一个只包含当前国家的数组,直接把之前的CountryList覆盖掉了!循环执行195次后,CountryList自然就只剩最后一次循环添加的那个国家了。
2. 同时,获取国家列表的逻辑也严重冗余
你的GetCountries方法里,循环195次每次都重新查询整个数据库表:
for (int i = 0; i < 195; i++) { countriesList = _context.Countries.Where(c => c.Country != null).Select(c => c.Country).ToList(); }
这不仅完全没必要,还导致了19秒的耗时——相当于你连续查了195次数据库!
修复后的完整代码
第一步:修复Controller的下拉列表赋值逻辑
把覆盖赋值改成逐步添加到列表的方式:
public async Task<IActionResult> OnGetAsync(string email) { List<string> countriesList = GetCountriesList.GetCountries(); Debug.WriteLine("************** 总共获取到国家数量: " + countriesList.Count); // 初始化一个空的SelectListItem集合 var selectItemList = new List<SelectListItem>(); // 遍历所有国家,逐个添加到集合中 foreach (var country in countriesList) { if (!string.IsNullOrWhiteSpace(country)) // 过滤空值,避免无效选项 { selectItemList.Add(new SelectListItem(country, country)); } } // 最后把完整的集合赋值给CountryList CountryList = selectItemList; // 填充视图的其他常规代码 return Page(); }
第二步:优化国家列表的数据库查询逻辑
去掉冗余循环,一次查询获取所有数据:
public static List<string> GetCountries() { _context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; // 一次查询获取所有非空的国家名称,直接返回列表 var countriesList = _context.Countries .Where(c => !string.IsNullOrWhiteSpace(c.Country)) .Select(c => c.Country) .ToList(); Debug.WriteLine("************** 查询到的国家列表: " + string.Join(", ", countriesList)); return countriesList; }
额外提示
- 不要写死循环次数(比如195),直接遍历查询到的列表更安全,避免索引越界异常。
- 加上空值过滤,防止下拉列表里出现空白选项。
- 优化后的查询逻辑会把耗时从19秒降到毫秒级,解决效率问题。
内容的提问来源于stack exchange,提问作者DMur
相关产品推荐
相关产品推荐

