You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:37:48