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

前言

上回说到,我们实现了IntArrayModelBinder,可以让 ASP.NET Core 绑定查询字符串中的数组。但是必须显示指定ModelBinder

public string Get([FromQuery][ModelBinder(BinderType = typeof(IntArrayModelBinder))] int[] values)

而官方提供的ByteArrayModelBinder不需要指定ModelBinder即可生效:

public string Get([FromQuery]byte[] values)

那么,它是如何做到的呢?

ByteArrayModelBinderProvider

在源码中查找ByteArrayModelBinder的所有引用。发现只有一处使用:

public class ByteArrayModelBinderProvider : IModelBinderProvider
{/// <inheritdoc />public IModelBinder? GetBinder(ModelBinderProviderContext context){if (context == null){throw new ArgumentNullException(nameof(context));}if (context.Metadata.ModelType == typeof(byte[])){var loggerFactory = context.Services.GetRequiredService<ILoggerFactory>();return new ByteArrayModelBinder(loggerFactory);}return null;}
}

MvcCoreMvcOptionsSetup

继续查找ByteArrayModelBinderProvider的所有引用。发现也只有一处使用:

internal class MvcCoreMvcOptionsSetup : IConfigureOptions<MvcOptions>, IPostConfigureOptions<MvcOptions>
{public void Configure(MvcOptions options){...options.ModelBinderProviders.Add(new ByteArrayModelBinderProvider());...}
}

那么,现在的思路就是,实现IntArrayModelBinderProvider,然后调用options.ModelBinderProviders.Add(new IntArrayModelBinderProvider());

现在,关键就在于这个MvcOptions在哪访问?

AddControllers 方法

继续查找MvcOptions的所有引用。发现使用的地方不少,但是,其中有一个扩展方法:

public static IMvcBuilder AddControllers(this IServiceCollection services, Action<MvcOptions>? configure)

IServiceCollection是可以在 Startup.cs 中访问的:

public void ConfigureServices(IServiceCollection services)

实现

接下来就好办了。

  1. 实现IntArrayModelBinderProvider

public class IntArrayModelBinderProvider : IModelBinderProvider
{ public IModelBinder? GetBinder(ModelBinderProviderContext context){if (context == null){throw new ArgumentNullException(nameof(context));}if (context.Metadata.ModelType == typeof(int[])){return new IntArrayModelBinder();}return null;}
}
  1. 修改 Startup.cs:

public void ConfigureServices(IServiceCollection services)
{services.AddControllers(options =>{options.ModelBinderProviders.Insert(0, new IntArrayModelBinderProvider());});
}
  1. 测试一下,执行成功:

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

df1eab7a9f414bb2eba1399a1ce8d751.png

结论

通过IntArrayModelBinderProvider,我们无需显示指定ModelBinder。即可让 ASP.NET Core 自动使用IntArrayModelBinder

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝网的技术发展史(三)——分布式时代

本文是《淘宝网的技术发展史》系列连载文的第三篇。在系统发展的过程中&#xff0c;架构师的眼光至关重要&#xff0c;作为程序员&#xff0c;把功能实现即可&#xff1b;但作为架构师&#xff0c;要考虑系统的扩展性、复用性&#xff0c;这种敏锐的感觉&#xff0c;有人说是一…

你知道出现“乱码”的原因是什么吗?(4)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

Android应用程序线程消息循环模型分析(4)

接下来我们再看看应用程序的配置文件AndroidManifest.xml&#xff1a;<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" package"shy.luo.counter" andr…

GIS专业核心课程电子教材配套实验数据汇总(持续更新)

本文整合了GIS专业核心课程电子pdf教材,包括地理信息系统、地图学、遥感、摄影测量、遥感数字图像处理、工程测量、施工测量、GPS、数字测图、空间数据库、程序设计等,持续更新。 一、ArcGIS10实验教程(配套实验数据) 二、地理信息系统

7月18日实习日志

今天的上午的工作和昨天一样&#xff0c;上午转发了三十篇&#xff0c;基本上没有遇到什么问题。下午还是转载视频和发稿。 转载于:https://www.cnblogs.com/a1107/p/5706351.html

我抓到bit哥了,嘿嘿嘿(5)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

遥感、地理空间数据、全国基础数据下载网站大全汇总

本文收集整理了国内外常用的遥感、GNSS、地理空间数据下载网站,可以下载各种格式的矢量、栅格等数据,主要包括遥感影像、NDVI、太阳辐射、数字高程模型等各种地理空间数据,供GISer学习交流使用。 1. 地理空间数据云 该网站为国内学者使用最多的、数据下载方便的网站,可以…

RPA之基于FlaUI的微信发送消息给某人

本文由网友蓝创精英团队投稿&#xff0c;欢迎转载、分享原文作者&#xff1a;蓝创精英团队原文链接&#xff1a;https://kesshei.blog.csdn.net/article/details/124955177目的一直想实现微信的群发功能&#xff0c;但是&#xff0c;没有实现&#xff0c;原因有一条是怕违法&am…

感受机房管理化繁为简-新款KVM使用心得

感受机房管理化繁为简-新款KVM使用心得 一、 背景 随着网络应用的不断增多&#xff0c;各地机房服务器数量也随之增加&#xff0c;利用多传统主机切换器的方式已经无法满足目前这种区域广、设备多人员紧缺的现状&#xff0c;而且即使是使用了一些远程管理软件&#xff0c;实现的…

我化身保姆为你提供 html 教学服务(6)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

那一年,我考入了西北师范大学GIS专业,然而我很迷茫,GISer的职业规划到底是怎样的?

那一年&#xff0c;我考入了西北师范大学&#xff0c;录取专业为地理信息系统&#xff0c;也就是常说的GIS&#xff0c;本科毕业后又考取了GIS专业的研究生&#xff0c;顺利毕业&#xff0c;进入了高校从事GIS教育工作。作为一个GISer&#xff0c;我相信有很多人跟我一样很迷茫…

Android之如何分析手机系统相册图片和视频删除后保存的位置

1 需求 需要获取各种型号手机系统相册图片和视频删除后保存的位置 2 分析 1)我们可以通过在sdcard目录下进行相关查找文件夹关键字,对 "cycle"或者"trash"或者*galle*进行忽略大小写模糊查询都有文件夹 find . -iname *cycle* find . -iname *trash*…

WPF 实现水珠效果按钮组

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;普通的地球人原文地址&#xff1a;https://www.cnblogs.com/tsliwei/p/8041928.html相关知识这部分基本就是废话,网上都能找到,我只不过是整理了以下.建议先不看,用到的时候可以回来看看贝…

组策略管理——软件限制策略(4)

编写软件限制规则 在前面几篇文章中讲了软件限制规则的基本概念&#xff0c;现在就来学习如何编写自定义软件限制策略。 编写规则应遵循的原则 首先&#xff0c;需要大家注意的是&#xff0c;软件限制策略应本着方便、安全、实用的原则来编写。限制规则灵活方便&#xff0c;自定…

我使用 html 反向输出自己打自己(7)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

Castle.DynamicProxy拦截器

在asp.net mvc或asp.net miniapi中&#xff0c;有过滤器&#xff0c;可以在请求前或后增加一层&#xff0c;达到验证&#xff0c;过滤等作用&#xff0c;如果在Service的方法前后加一层呢&#xff1f;这里介绍一下Castle.DynamicProxy的用法。首先引入Castle.Core实现代码相对轻…

Android选项切换条SHSegmentControl

&#xfeff;&#xfeff;Android选项切换条SHSegmentControl SHSegmentControl是github上一个开源的选项切换条&#xff0c;其样式如图所示&#xff1a; SHSegmentControl在github上的项目主页地址&#xff1a;https://github.com/7heaven/SHSegmentControl SHSegmentControl…

从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)

原本关于T4模板原想分5个章节详细解说的&#xff0c;不过因为最近比较忙&#xff0c;也不想将整个系列时间拉得太长&#xff0c;所以就将它们整合在一块了&#xff0c;可能会有很多细节没有讲到&#xff0c;希望大家自己对着代码与模板去研究。 本章代码量会比较大&#xff0c;…

赶紧3分钟学完15分钟的内容我要出去玩(8)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

Hello Playwright:(5)查找元素

操作浏览器归根到底就是和页面进行交互&#xff0c;那么必不可少的操作就是查找页面上的元素。因此我们需要熟练掌握Locator 定位器。在上一节我们讲过&#xff0c;可以使用Page.Locator(selector, options)方法创建定位器&#xff0c;而如何定位到元素则取决于selector 选择器…