ASP.NET Core 8 MVC:无法绑定到名为过滤器的参数

问题描述 投票:0回答:1

背景

正在使用的东西:

  • .NET 8
  • ASP.NET Core MVC
  • 剑道网格
  • IIS Express

我开始处理一个现有项目,并添加了一个控制器操作,该操作通过 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”时绑定不起作用。

  1. 将属性类型从

    int[]
    string[]
    更改为
    List<int>, List<string>

  2. 向参数添加了

    [FromForm]
    属性

  3. 查看

    Startup.cs
    以查看是否使用了任何自定义活页夹提供程序。有一个支持
    int[]
    List<int>
    的提供程序,代码看起来可能会出错,所以我注释掉了包含它的以下行并停止/开始调试:

     service.AddMvcCore(option => { option.ModelBinderProvider.Insert(...) });
    
  4. 更改操作参数的顺序,以便

    filter
    首先出现,以防其他参数的绑定导致问题。

如果有人可以帮助找出为什么参数名称

filter
不能与绑定一起使用,我将非常感激。

c# asp.net-core-mvc asp.net-core-8
1个回答
-1
投票

尝试使用IModelBinder。传入请求数据和应用程序模型之间的映射。 https://learn.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-8.0。 也可能是请求的提交形式和操作中的模型不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.