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

Razor ASP.NET:多参数图表数据过滤之设备ID传参异常

设备ID多选过滤功能失效问题

现有视图加载时Chart.js图表显示正常,日期过滤功能可正常使用,但设备ID多选过滤功能失效:选择一个或多个equipmentId后,通过AJAX调用后端OnGetFilterChart方法时,设备ID数组无法正确传递到后端方法。

现有代码

后端控制器代码

public async Task<IActionResult> OnGetFilterChart(int[] equipmentId, DateTime? startDate, DateTime? endDate)
{
    IQueryable<ReplacementRecord> query = _context.ReplacementRecord;
    if (equipmentId != null && equipmentId.Length > 0)
    {
        query = query.Where(r => equipmentId.Contains(r.EquipmentId));
    }
    if (startDate != null && endDate != null)
    {
        query = query.Where(r => r.ReplacementDateTime.Date >= startDate &&  r.ReplacementDateTime.Date <= endDate);
    }
    var data = await query
        .GroupBy(r => r.ReplacementDateTime.Date)
        .Select(g => new { Date = g.Key, Quantity = g.Sum(r => r.Quantity) })
        .OrderBy(r => r.Date)
        .ToListAsync();
    JsonResult json = new JsonResult(data);
    return json;
}

前端视图代码

<div class="form-group">
    <label for="equipmentId">Filter by Equipment:</label>
    @Html.DropDownList("equipmentId", Model.EquipmentIds, "-- All --", new { @class = "form-control my_equipment", @multiple = "multiple" })
    <label for="startDate">Start Date:</label>
    <input type="date" id="startDate" name="startDate" class="form-control" />
    <span>End Date:</span>
    <input type="date" id="endDate" name="endDate" class="form-control" />
    <button type="button" id="applyFilterBtn" class="btn btn-primary">Apply Filter</button>
</div>

前端JS代码

document.getElementById('applyFilterBtn').addEventListener('click', function () {
    applyFilter();
});
function applyFilter() {
    var my_equipments = document.getElementsByClassName('my_equipment');
    var equipmentId = [];
    for (var i =0; i < my_equipments.length; i++)
    {
        equipmentId.push(my_equipments[i].value);
    }
    var startDate = document.getElementById('startDate').value;
    var endDate = document.getElementById('endDate').value;
    var data = {
        equipmentId: equipmentId,
        startDate: startDate,
        endDate: endDate
    };
    $.ajax({
        url: '/ReplacementRecords/Chart?handler=FilterChart',
        type: 'GET',
        data: data,
        dataType: 'json',
        success: function (result) {
            let chartStatus = Chart.getChart("chart");
            if (chartStatus != undefined) {
                chartStatus.destroy();
            }
            drawChart(result);
        },
        error: function (xhr, status, error) {
            console.log("Can`t perform chart filtering");
        }
    });
}

问题原因及修复方案

问题1:多选下拉框取值逻辑错误

原代码通过getElementsByClassName获取下拉框元素后直接取value,只能拿到第一个选中项的值,无法收集所有选中的设备ID。

修复: 遍历下拉框的options集合,筛选并收集所有选中项的value,同时转成数字类型(匹配后端int数组):

function applyFilter() {
    // 直接通过ID获取下拉框元素(更精准)
    var equipmentSelect = document.getElementById('equipmentId');
    var equipmentId = [];
    // 遍历所有选项,收集选中项的value
    for (var i = 0; i < equipmentSelect.options.length; i++) {
        if (equipmentSelect.options[i].selected) {
            equipmentId.push(parseInt(equipmentSelect.options[i].value));
        }
    }
    // 保留原有日期取值逻辑
    var startDate = document.getElementById('startDate').value;
    var endDate = document.getElementById('endDate').value;
    
    var data = {
        equipmentId: equipmentId,
        startDate: startDate,
        endDate: endDate
    };
    // ... 后续AJAX代码
}

问题2:GET请求数组序列化格式不匹配

ASP.NET Core默认期望数组参数以equipmentId=1&equipmentId=2的形式传递,但jQuery默认会把数组序列化为equipmentId[]=1&equipmentId[]=2,导致后端无法正确绑定。

修复: 在AJAX请求中添加traditional: true,启用传统的参数序列化方式:

$.ajax({
    url: '/ReplacementRecords/Chart?handler=FilterChart',
    type: 'GET',
    data: data,
    // 启用传统序列化,适配ASP.NET Core的数组参数绑定
    traditional: true,
    dataType: 'json',
    success: function (result) {
        let chartStatus = Chart.getChart("chart");
        if (chartStatus != undefined) {
            chartStatus.destroy();
        }
        drawChart(result);
    },
    error: function (xhr, status, error) {
        console.log("无法执行图表过滤");
    }
});

可选:明确后端参数绑定来源

如果仍有绑定问题,可以给后端参数添加[FromQuery]特性,明确指定从URL查询字符串绑定:

public async Task<IActionResult> OnGetFilterChart([FromQuery]int[] equipmentId, DateTime? startDate, DateTime? endDate)
{
    // 原有业务逻辑不变
}

内容的提问来源于stack exchange,提问作者Антон Ласько

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:24:58