C# MVC JS通过URL Action调用获取数据库字符串报错求助
下拉框选中后从数据库取值的类型错误排查与修复
问题背景
表单下拉框选中时已能触发JS函数并传递参数到Controller,但当前因Controller、Service层的类型不匹配导致编译失败,此前还出现过调用数据库无数据返回的情况。
现有代码
视图JS函数(可正常运行)
$("#FormInput_selector").change( function GetOtherValue(event) { var selection = $(this).find('option:selected').val(); var url = '@Url.Action("GetOtherValue", "Operations")' + "?value=" + selection; $.get(url, function (data) { console.log(data); }); })
Controller代码
public ActionResult GetOtherValue(string value) { DataService db = new DataService(); return db.GetSECMarket(value); }
Service代码
internal ActionResult GetOtherValue(string value) { using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(ConnectionString_DEV)) { return connection.Query<ActionResult>("dbo.StoredProcedureToGetValue @Value", new { @Value = value }); } }
核心问题分析
- Service层职责混淆:Service不该直接返回
ActionResult,这是Controller的专属职责。Service的核心作用是获取/处理数据,应返回实际的数据模型或集合,而非MVC的Action结果类型。 - Dapper泛型类型错误:
connection.Query<T>的泛型参数必须是存储过程返回数据对应的实体模型类型,而非ActionResult。Query方法返回的是IEnumerable<T>集合,和ActionResult类型完全不兼容,这是编译错误的直接根源。 - Controller返回逻辑错误:Controller需要接收Service返回的数据,再包装成前端可识别的
ActionResult(比如JsonResult返回JSON数据,或PartialViewResult返回视图片段)。
修复步骤
1. 定义匹配的数据模型
根据存储过程返回的字段,创建对应的实体类:
public class SECMarketModel { public int Id { get; set; } public string MarketName { get; set; } // 其他字段需与存储过程返回的列名一一对应 }
2. 修改Service层代码
Service仅负责数据查询,返回模型集合或单个模型:
internal IEnumerable<SECMarketModel> GetSECMarket(string value) { using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(ConnectionString_DEV)) { // 泛型参数替换为定义好的数据模型,Query返回IEnumerable<T>类型 return connection.Query<SECMarketModel>("dbo.StoredProcedureToGetValue @Value", new { @Value = value }); } }
注:如果存储过程仅返回单条数据,可改用
QueryFirstOrDefault<SECMarketModel>方法
3. 修改Controller层代码
接收Service返回的数据,包装为前端AJAX请求所需的JsonResult:
public JsonResult GetOtherValue(string value) { DataService db = new DataService(); var marketData = db.GetSECMarket(value); // 返回JSON数据并允许前端跨域访问(按需开启) return Json(marketData, JsonRequestBehavior.AllowGet); }
4. 前端处理返回数据
根据返回的JSON数据更新页面元素,示例如下:
$.get(url, function (data) { console.log(data); // 示例:若返回单条数据,填充到指定输入框 // $("#targetInput").val(data.MarketName); // 若返回集合,可遍历生成下拉选项或列表 });
额外排查点(针对此前无数据返回的情况)
- 核对存储过程的参数名是否与代码中
@Value完全一致 - 确认
ConnectionString_DEV指向的数据库环境正确 - 在Service中添加调试日志,检查传入的
value参数是否正确,存储过程执行结果是否符合预期
内容的提问来源于stack exchange,提问作者t73designs
相关产品推荐
相关产品推荐

