微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASP.NET Core 3.1绑定到List <int>通用列表属性不起作用

如何解决ASP.NET Core 3.1绑定到List <int>通用列表属性不起作用

我试图在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>();
}

当我提交带有以下表单数据的http POST时:

CustomerId: 1
SchoolIds[0]: 2
SchoolIds[1]: 3

我的属性已成功绑定,但SchoolIds属性集合却没有,该属性总是返回空。

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

我相信使用自定义IModelBinderProvider可以解决此问题,但是我想知道什么是解决此问题的正确/最佳方法,并确保我可以使用name[x] form schema正确地绑定通用列表我的ASP.NET Core应用程序?

解决方法

我认为您在控制器的方法参数和请求的参数名称中缺少> | id | > | -: | > | 2 | > | 3 | 属性。我从未使用过NopCommerce。发送表单数据时,以下是正确的收集格式:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-3.1#collections。该请求的正文应起作用:

[FromForm]

此代码对我来说很好,不需要任何自定义模型绑定器:

model.CustomerId=1&model.SchoolIds[]=12&model.SchoolIds[]=321

我在Powershell中使用Invoke-WebRequest对其进行了测试:

public class FormDto
{
    public int Id { get; set; }
    public List<int> ListOfIds { get; set; }
}

[Route("api/[controller]")]
[ApiController]
public class FormController : ControllerBase
{
    [HttpPost]
    [Route("post")]
    public ActionResult Post([FromForm] FormDto dto)
    {
        Console.WriteLine(JsonConvert.SerializeObject(dto,Formatting.Indented));
        return Ok();
    }
}

控制台中的输出:

iwr -uri http://localhost:5000/api/form/post -Method Post -Body 'dto.Id=13&dto.ListOfIds[]=1&dto.ListOfIds[]=2&dto.ListOfIds[]=34' -ContentType 'application/x-www-form-urlencoded'
,

所以对于任何有兴趣的人来说,它可能归结为Nop不喜欢使用通用列表。

我查看了here中Nop使用的默认活页夹 通过将模型更改为此,我能够成功解决问题:

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

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

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。