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

C# MVC中ViewModel数据无法在Datatable显示且返回无效JSON问题

问题核心原因

你当前的/Home/TFSA接口同时承担了两个冲突的职责:响应页面加载请求返回HTML视图、响应Datatable的AJAX请求返回JSON数据,所以Datatable发起请求时拿到的是HTML代码,自然报无效JSON错误。

以下是两种可直接落地的解决方案:


方案1:拆分接口(推荐,适合数据量大、需要Datatable服务端分页/搜索的场景)

第一步:调整原控制器Action

原TFSA Action仅负责返回页面视图:

public ActionResult TFSA()
{
    return View();
}

第二步:新增专门返回交易数据的接口

新增一个独立Action专门响应Datatable的数据请求:

public ActionResult GetTFSAActiveTrades()
{
    var trades = db.Trades.Where(t => t.AccountName == "TFSA" && t.Active == true).OrderBy(l => l.TradeID).ToList();
    var activeTrades = Mapper.Map<IEnumerable<Trade>, List<ActiveTradesViewModel>>(trades);
    // 按Datatable要求返回带data字段的JSON结构
    return Json(new { data = activeTrades }, JsonRequestBehavior.AllowGet);
}

第三步:修改视图中Datatable的请求地址

把ajax配置的url改为新的接口地址:

"ajax": {
    "url": "/Home/GetTFSAActiveTrades",
    "type": "GET",
    "dataType": "json"
},

方案2:页面渲染时直接注入数据(适合数据量小、不需要服务端处理分页/搜索的场景)

不需要额外接口,页面加载时直接把数据序列化后传给Datatable,少一次HTTP请求。

第一步:调整原控制器Action

把构造好的视图模型传给视图:

public ActionResult TFSA()
{
    var trades = db.Trades.Where(t => t.AccountName == "TFSA" && t.Active == true).OrderBy(l => l.TradeID).ToList();
    TradeIndexViewModel model = new TradeIndexViewModel()
    {
        ActiveTrades = Mapper.Map<IEnumerable<Trade>, List<ActiveTradesViewModel>>(trades)
    };
    return View(model);
}

第二步:修改视图中Datatable初始化逻辑

去掉ajax配置,直接用Razor序列化模型数据传给Datatable:

$('#tfsaActiveTrades').DataTable({
    // 直接注入序列化后的交易数据,不需要额外AJAX请求
    "data": @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.ActiveTrades)),
    "columns": [
        // 原有columns配置保持不变即可
    ]
});

内容的提问来源于stack exchange,提问作者pekMeister

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:30:02