C# ASP.NET Core 3.1绑定到列表<;int>;(通用列表)属性不工作

C# ASP.NET Core 3.1绑定到列表<;int>;(通用列表)属性不工作,c#,asp.net,forms,asp.net-core,nopcommerce,C#,Asp.net,Forms,Asp.net Core,Nopcommerce,我正在尝试在ASP.NET Core 3.1下的NopCommerce内部实现一个控制器方法,如下所示: [HttpPost] [Route("CustomerSchool/Update")] public IActionResult Update(CustomerSchoolMappingModel model) { } public class CustomerSchoolMappingModel : BaseNopModel { public int Cus

我正在尝试在ASP.NET Core 3.1下的NopCommerce内部实现一个控制器方法,如下所示:

[HttpPost]
[Route("CustomerSchool/Update")]
public IActionResult Update(CustomerSchoolMappingModel model)
{

}
public class CustomerSchoolMappingModel : BaseNopModel
{
    public int CustomerId { get; set; }

    public List<int> SchoolIds { get; set; } = new List<int>();
}
我的模型如下所示:

[HttpPost]
[Route("CustomerSchool/Update")]
public IActionResult Update(CustomerSchoolMappingModel model)
{

}
public class CustomerSchoolMappingModel : BaseNopModel
{
    public int CustomerId { get; set; }

    public List<int> SchoolIds { get; set; } = new List<int>();
}
我的属性已成功绑定,但SchoolIds属性集合未绑定,该集合始终返回空

我怀疑NopCommerce已经替换了默认的ModelBinder(我相信它在ASP.NET中默认支持此功能),但我不能100%确定如何正确替换/实现此功能


我相信使用自定义的
IModelBinderProvider
可以解决此问题,但我想知道解决此问题的正确/最佳方法是什么,并确保我可以使用ASP.NET核心应用程序中的
name[x]表单模式正确绑定泛型列表?

我认为您缺少
[FromForm]
控制器中方法参数的属性和请求中的参数名称。我从来没有用过电子商务。发送表单数据时,以下是正确的集合格式:。该请求机构应:

model.CustomerId=1&model.SchoolIds[]=12&model.SchoolIds[]=321
这段代码在没有任何自定义模型绑定的情况下非常适合我:

公共类FormDto
{
公共int Id{get;set;}
公共列表ListOfIds{get;set;}
}
[路由(“api/[控制器]”)]
[ApiController]
公共类FormController:ControllerBase
{
[HttpPost]
[路线(“邮政”)]
公共行动结果公告([FromForm]FormDto dto)
{
WriteLine(JsonConvert.SerializeObject(dto,Formatting.Indented));
返回Ok();
}
}
我在Powershell中使用Invoke WebRequest对其进行了测试:

iwr-urihttp://localhost:5000/api/form/post -方法Post-Body'dto.Id=13&dto.ListOfIds[]=1&dto.ListOfIds[]=2&dto.ListOfIds[]=34'-ContentType'application/x-www-form-urlencoded'
控制台中的输出:

{
“Id”:13,
“ListOfIds”:[
1.
2.
34
]
}

因此,对于任何感兴趣的人来说,这似乎归结为Nop不喜欢使用通用列表

我从和中查看了Nop使用的默认绑定 通过将模型更改为以下内容,我成功地解决了问题:

public class CustomerSchoolMappingModel : BaseNopModel
{
    public int CustomerId { get; set; }

    public ICollection<int> SchoolIds { get; set; } = new List<int>();

}
公共类CustomerSchoolMappingModel:BaseNopModel
{
public int CustomerId{get;set;}
公共ICollection学校ID{get;set;}=new List();
}

非常感谢您提供了详细的分类,您很可能是正确的,正如前面提到的,我希望这在默认项目中起作用,但是我在NopCommerce中使用它,这显然会干扰默认绑定。我已经尝试过使用[FromForm],并且可以确认它在我的场景中没有帮助。谢谢您的支持。您是否尝试在请求中添加参数名称(
model
)?我在回答中举了一个例子。当我测试它时,我不得不在我的请求主体中添加
dto
。我没有,但在进行了更多的研究之后,NopCommerce似乎实现了它自己的完全自定义模型绑定。我应该有一个答案,我将很快发布,其中显示了如何解决Nop的这个问题,但你的答案可能是最适合其他谁遇到这种情况以外的Nop商业。