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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:01:00