ASP.NET Core MVC中SQL数据库数据填充下拉框问题求助
下拉框未加载Counter表数据的排查与修复
核心问题及修复方案
1. SelectListItem构造参数错误
GetCounterData方法中创建下拉选项时,第二个参数传入了空字符串,无法正确获取值字段,导致选项初始化失败:
// 错误代码 SelectListItem item = new( results.GetData<string>("CounterType"), results.GetData<string>("") );
修复:指定有效的值字段(若需要值与显示文本一致,可直接复用CounterType;若表中有主键字段如CounterID,建议用主键作为值):
// 示例:值和文本均使用CounterType SelectListItem item = new( results.GetData<string>("CounterType"), results.GetData<string>("CounterType") );
2. 默认选项赋值错误
LoadServiceType中给默认选项重复赋值Text,未设置Value,导致默认项无效:
// 错误代码 var objDefaultListItem = new SelectListItem(); objDefaultListItem.Text = "NoSelection"; objDefaultListItem.Text = "Select Service Type";
修复:分别设置Value和Text属性:
var objDefaultListItem = new SelectListItem(); objDefaultListItem.Value = "NoSelection"; objDefaultListItem.Text = "Select Service Type";
3. 模型缺少绑定属性
视图中asp-for="ServiceType"绑定的属性未在Request模型中定义,导致下拉框无法完成双向绑定:
// 在Request模型中添加 public string? ServiceType { get; set; }
4. Session缓存导致数据不刷新
GetCounterData首次查询后将数据存入Session,后续请求直接读取缓存,若数据库数据更新,下拉框不会同步。若无需缓存,可移除Session相关逻辑:
public List<SelectListItem>? GetCounterData(string strQuery) { List<SelectListItem> ret = []; try { string strConnect = connectionStrings.Get("EquipmentConnectString"); using (var conn = strConnect.OpenConnection()) { var results = conn.ExecuteReaderText(strConnect, strQuery, []); if (results != null) { while (results.Read()) { SelectListItem item = new( results.GetData<string>("CounterType"), results.GetData<string>("CounterType") ); ret.Add(item); } } } return ret; } catch (Exception objerr) { // 添加日志记录,避免吞掉异常 _logger.LogError(objerr, "获取Counter数据失败"); return null; } }
5. 异常处理未记录错误
原代码吞掉了数据库查询异常,无法定位问题根源,建议注入ILogger记录错误信息,便于排查。
6. SelectList构造参数优化
原代码中SelectList使用"Text"同时作为值字段和显示字段,若需区分值与文本,应对应SelectListItem的Value和Text属性:
ret.Services = new SelectList(lstServiceType, nameof(SelectListItem.Value), nameof(SelectListItem.Text));
验证步骤
- 直接执行SQL语句
Select * from vw_EQCN where countertype = 'ServiceType',确认能查询到有效数据。 - 检查
EquipmentConnectString数据库连接字符串配置正确,数据库连接正常。 - 在
RetrieveCounter方法中添加调试输出,查看objDataView的数量是否大于0。
内容的提问来源于stack exchange,提问作者mag232913
相关产品推荐
相关产品推荐

