背景
正在使用的东西:
我开始处理一个现有项目,并添加了一个控制器操作,该操作通过 Kendo Grid AJAX 发布到该项目,并通过 JSON 提供数据。
我有一个类
MyFilter
,我想将数据绑定到其上,匿名名称和简化:
public class MyFilter
{
public MyFilter()
{}
public int[] MyIntIds { get; set; }
public string[] MyStringIds { get; set; }
}
这是控制器操作:
[HttpPost]
public async Task<IActionResult> MyAction([DataSourceRequest] DataSourceRequest dataSrcReq, MyFilter filter)
{
// ...
}
当我与具有剑道网格的页面交互并通过搜索触发AJAX时,网格使用以下JS来传递过滤器数据:
function gridGetSearchQuery() {
var filter = {
"@Html.NameFor(_ => _.MyIntIds)": getKendoMultiSelectAsArray("#@Html.IdFor(_ => _.MyIntIds)"),
"@Html.NameFor(_ => _.MyStringIds)": getKendoMultiSelectAsArray("#@Html.IdFor(_ => _.MyStringIds)")
};
return filter;
}
当我的操作方法被调用时,我可以在快速监视窗口中看到类似这样的内容:
Request.Form.Keys // has a bunch of values including: MyIntIds[0]
如果我看:
Request.Form["MyIntIds[0]"] // gives, e.g. 265
问题
在控制器操作方法中,
filter.MyIntIds
属性中没有任何内容。如果我要触发为此发送数据,则 .MyStringIds
也是如此。
我的解决方法
如果我将操作参数名称从
filter
更改为其他任何内容,例如filters, fubar, wth
,然后在不更改任何其他内容的情况下,上面指示的值现在将开始绑定并且:
wth.MyIntIds.Length // Renamed param to wth, length now = 1, and has, given above example, wth[0] = 265
我尝试过的事情
我做了以下操作,所有这些都没有效果,当参数被称为“filter”时绑定不起作用。
将属性类型从
int[]
和 string[]
更改为 List<int>, List<string>
向参数添加了
[FromForm]
属性
查看
Startup.cs
以查看是否使用了任何自定义活页夹提供程序。有一个支持 int[]
和 List<int>
的提供程序,代码看起来可能会出错,所以我注释掉了包含它的以下行并停止/开始调试:
service.AddMvcCore(option => { option.ModelBinderProvider.Insert(...) });
更改操作参数的顺序,以便
filter
首先出现,以防其他参数的绑定导致问题。
如果有人可以帮助找出为什么参数名称
filter
不能与绑定一起使用,我将非常感激。
尝试使用IModelBinder。传入请求数据和应用程序模型之间的映射。 https://learn.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-8.0。 也可能是请求的提交形式和操作中的模型不匹配。