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

.NET 6迁移后,jQuery redirectPost传参filterOptions始终为空求助

.NET 6控制器中filterOptions参数始终为null

正在将应用程序从.NET Framework迁移至.NET 6,点击“Download Report”按钮时,前端向控制器发送数据,但控制器的filterOptions参数始终为null。以下是相关代码,求排查解决。

前端代码

HTML

<button id="btnReport">Download Report</button>

<div class="form-group">
  <select class="form-control select2" id="selectFilter" multiple="multiple">
        <option value="OK">OK</option>
        <option value="ERROR">ERROR</option>
   </select>
</div>

JavaScript

var filterOptions = {
    Options: [],
    Data: '',
}

function AddFilters(options, data) {
    filterOptions.Options = options;
    filterOptions.Data = data       
}

$('#btnReport').click(function (e) {
    AddFilters(
        $('#selectFilter').select2('data').map((x) => x.id) 
        , $('#txtData').val()
    );

    var startDate = moment($('#rStartDate').datepicker('getDate'));
    var endDate = moment($('#rEndDate').datepicker('getDate'));

    return $.redirectPost('@Url.Action("MyMethod", "Controller")', 
                            { 
                                startDate.toISOString(),
                                endDate.toISOString(),
                                filterOptions 
                            });
});

后端控制器代码

[HttpPost]
public ActionResult MyMethod(DateTime? startDate,
                                 DateTime? endDate,
                                 Filters filterOptions)
{
    /*More code*/
}

public class Filters
{
    public IEnumerable<string> Options { get; set; }
    public string Data { get; set; }
}

排查与解决方法

  • 参数传递格式错误:原JS中$.redirectPost的参数未指定键名,导致后端无法匹配参数。需要给每个参数明确指定与控制器一致的键名,比如startDate: startDate.toISOString()而非直接写值。
  • 模型绑定特性缺失:.NET 6默认对复杂类型的模型绑定需要明确来源,给filterOptions参数添加[FromForm]特性,告知框架从表单数据中绑定该对象。
  • Select2数据获取问题:原代码中x.id可能并非选中项的真实值,直接使用$('#selectFilter').val()可以更可靠地获取多选框选中的value数组。
  • 复杂对象序列化验证:确认$.redirectPost能正确序列化嵌套对象filterOptions,若为自定义方法,需确保它将对象序列化为filterOptions.Options[0]=OK&filterOptions.Data=xxx这类表单可识别的格式。

修改后的代码示例

修正后的JavaScript

$('#btnReport').click(function (e) {
    e.preventDefault();

    // 直接获取选中的value数组
    const selectedOptions = $('#selectFilter').val() || [];
    const dataValue = $('#txtData').val();

    const startDate = moment($('#rStartDate').datepicker('getDate')).toISOString();
    const endDate = moment($('#rEndDate').datepicker('getDate')).toISOString();

    return $.redirectPost('@Url.Action("MyMethod", "Controller")', 
                            { 
                                startDate: startDate,
                                endDate: endDate,
                                filterOptions: {
                                    Options: selectedOptions,
                                    Data: dataValue
                                }
                            });
});

修正后的控制器代码

[HttpPost]
public ActionResult MyMethod(DateTime? startDate,
                             DateTime? endDate,
                             [FromForm] Filters filterOptions)
{
    /*More code*/
}

public class Filters
{
    public IEnumerable<string> Options { get; set; }
    public string Data { get; set; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:45:55