如何让 ASP.NET Core 支持绑定查询字符串中的数组

前言

有网友在交流群中询问,如何让 ASP.NET Core 支持绑定查询字符串中的数组:

9c61b2a6c23e438ffd235e1f0159619a.png

据说,在 .NET 7 中已经支持了:

d78214afc8fb1b122e25e02e1d3ad107.png

但是,在这之前的 .NET 版本能实现相同功能吗?

ByteArrayModelBinder

这时,群里的网友提供了一个思路,使用 base64 编码

345a066d7c746ad59d779552ccd5a6fb.png

查看官方文档,确实可以实现:

236a9809931b124bf17540b3c03d6259.png

缺点是只支持byte[],不能使用int[]:

[HttpGet]
public string Get([FromQuery]byte[] values)
{
    return string.Join(" ", values.Select(p => p.ToString()));
}

d5c69473dda55c64ac4ba4d48a40746c.png

06681cb640635e5e3f126f6a385ce154.png

但是,我们可以借鉴ByteArrayModelBinder的实现思路,实现我们自己的IntArrayModelBinder

IntArrayModelBinder

查看ByteArrayModelBinder的源码,关键代码如下:

public class ByteArrayModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        //获取传入的值
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        
        var value = valueProviderResult.FirstValue;
        
        //Base64 转 byte[]
        var model = Convert.FromBase64String(value);

        //绑定到参数
        bindingContext.Result = ModelBindingResult.Success(model);
        
        return Task.CompletedTask;
    }
}

我们依葫芦画瓢,实现IntArrayModelBinder

public class IntArrayModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        //获取传入的值
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        var value = valueProviderResult.FirstValue;

        //string 转 int[]
        var model = value.Trim('[',']').Split(',').Select(str=>int.Parse(str)).ToArray(); 

        //绑定到参数
        bindingContext.Result = ModelBindingResult.Success(model);

        return Task.CompletedTask;
    }
}

测试一下使用IntArrayModelBinder,执行成功:

[HttpGet]
public string Get([FromQuery][ModelBinder(BinderType = typeof(IntArrayModelBinder))] int[] values)
{
    return string.Join(" ", values.Select(p => p.ToString()));
}

710e58896d8a811c710ed85e0e07791b.png

结论

可能你已经注意到,在使用byte[]时,我们并没有显示指定ModelBinder。那ASP.NET Core 是如何实现自动使用ByteArrayModelBinder的呢?我们下回分解。

添加微信号【MyIO666】,邀你加入技术交流群

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值