.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
相关产品推荐
相关产品推荐

