.Net Core 迁移之坑一 《WebAPI Get请求参数传入输入带有[]不识别问题》
在Framwork 体系下 WebAPI项目 会有很多默认特性,例如:Get查询竟然支持三种数组查询方式
1.https://localhost:44390/api/values?status=1&status=2
2.https://localhost:44390/api/values?status[]=1&status[]=2
3.https://localhost:44390/api/values?status[0]=1&status[1]=2

直到客户端同鞋找到我,才发现第二种在.net core webapi 默认竟然不支持
于是google了好久加上询问大牛,才找到一个解决方案,就是通过 Conventions 解决
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Primitives;
using System;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks; namespace WebApplication
{
public class ArraryHandleQueryConvention : IParameterModelConvention
{
public void Apply(ParameterModel parameter)
{
if (parameter.ParameterType.IsArray || parameter.Attributes.OfType<FromQueryAttribute>().Any())
parameter.Action.Filters.Add(new ArrayQueryStringAttribute(parameter.ParameterName));
}
}
public class ArrayQueryStringValueProvider : QueryStringValueProvider
{
private readonly string _key;
private readonly IQueryCollection _values; public ArrayQueryStringValueProvider(IQueryCollection values)
: this(null, values)
{
} public ArrayQueryStringValueProvider(string key, IQueryCollection values)
: base(BindingSource.Query, values, CultureInfo.InvariantCulture)
{
_key = key;
_values = values;
} public override ValueProviderResult GetValue(string key)
{
var result = base.GetValue(key + "[]"); if (_key != null && _key != key)
{
return result;
}
if (result != ValueProviderResult.None)
{
var splitValues = new StringValues(result.Values.ToArray());
return new ValueProviderResult(splitValues, result.Culture);
}
return result;
}
} [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class ArrayQueryStringAttribute : Attribute, IResourceFilter
{
private readonly ArrayQueryStringValueProviderFactory _factory; public ArrayQueryStringAttribute(string key)
{
_factory = new ArrayQueryStringValueProviderFactory();
} public void OnResourceExecuted(ResourceExecutedContext context)
{
} public void OnResourceExecuting(ResourceExecutingContext context)
{
context.ValueProviderFactories.Insert(, _factory);
}
}
public class ArrayQueryStringValueProviderFactory : IValueProviderFactory
{
private readonly string _key; public ArrayQueryStringValueProviderFactory()
{
} public ArrayQueryStringValueProviderFactory(string key)
{
_key = key;
} public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
{
context.ValueProviders.Insert(, new ArrayQueryStringValueProvider(_key, context.ActionContext.HttpContext.Request.Query));
return Task.CompletedTask;
}
}
}
StartUp 里面添加就行了如图

说者无意听者有心,后来大牛找到我说其实还有第二种方式 就是 JQueryQueryStringValueProviderFactory

1行代码就解决了有木有
看下结果大功告成

.Net Core 迁移之坑一 《WebAPI Get请求参数传入输入带有[]不识别问题》的更多相关文章
- .NET Core 迁移躺坑记
最近将自己负责的一个核心接口系统从.Net Framework迁移到了.Net Core. 整体过程,从业务层面说一般般吧(整体还好但还是搞的业务有感,没出严重故障)但是技术层面上感觉其实并没有达到要 ...
- .NET Core 迁移躺坑记续集--Win下莫名其妙的超时
继上一集里说到遇到的各种问题并且弄了n个解决方案之后,特别是对于问题4的解决方案对于切换了HttpClientFactory 我用了你家netcore 2.1下专门解决之前HttpClient口病已久 ...
- .Net Core 迁移之坑二 《ToString("F") 输出与windows不一致问题》
大家都知道 ToString("F") 是干什么的 这里我还是介绍一下 格式字符串采用以下形式:Axx,其中 A 为格式说明符,指定格式化类型,xx 为精度说明符,控制格式化输出的 ...
- .NET CORE迁移踩坑
https://www.cnblogs.com/leolaw/p/10740678.html
- Asp.net webapi 判断请求参数是否为空简易方法 Model Validation 判断请求参数是否为空
通常情况下,对于那些经常为别人提供数据接口的开发人员来说,对于调用方传递过来的参数都会有验证处理.例如: if (string.IsNullOrEmpty(entity.Name)) { //当姓名为 ...
- webapi 获取请求参数
//获取请求消息提数据 Stream stream = filterContext.Request.Content.ReadAsStreamAsync().Result; Encoding encod ...
- ASP.Net Core开发(踩坑)指南
ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET MVC应用迁移到ASP.NE ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- .Net Core迁移到MSBuild平台(二)
一.前言 在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下新的项目配置文件中的节点配置,这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程 ...
随机推荐
- Android 中的BroadCastReceiver
BroadCastReceiver 简介 (末尾有源码) BroadCastReceiver 源码位于: framework/base/core/java/android.content.Broadc ...
- Audio/Movie/Image
Audio 1. 引入AVFoundation 库,此库用于处理音频的播放. > 使用AVAudioPlayer 播放音频,此类只能播放本地音频文件.对于流媒体(边下边播)的播放使用第三方框架实 ...
- android代码设置EditText只输入数字、字母
如何设置EditText,使得只能输入数字或者某些字母呢? 一.设置EditText,只输入数字: 方法1:直接生成DigitsKeyListener对象就可以了. et_1.setKeyLis ...
- 关于15桥梁课程1&2的笔记以及待做事项的梳理
1.指针所占用的空间是固定的 2.void *malloc(sizeof(int)); (这玩意耗时间,老师说通过内存池解决) free(p);free(p); 两次free()报错,正确的做法: ...
- pmm监控页面502
我们知道pmm主要使用的是 普罗米修斯采集和grafana日志统计显示. 最近为硬盘扩过一次容量,主要是docker使用的,我的pmm是跑在docker上的,但是重启后pmm的debug日志下载502 ...
- 在web.config中配置httpHandlers节点是的说明
<system.web> <httpHandlers> <add verb="*" path="*.lcj" type=" ...
- bzoj 4881 [Lydsy1705月赛]线段游戏
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4881 1.当一块相互交织的线段中有3个或以上两两相交的那种线段时,无解. 这就是最长下降子序 ...
- 通过ssh连接git操作
项目又一次从svn切换到git,而且要求使用安全协议ssh连接git.不管是个人还是组织,git上只负责导入公钥,而不会帮你生成.这里先说下怎么生成这个ssh的私钥和公钥. 首先你得找到有ssh命令的 ...
- 老齐python-基础1
1.基本对象类型 1.1数: >>> 3 #基本数字 3 >>> 3333 3333 >>> 3.222 3.222 >>&g ...
- centOS下 JDK的三种安装方式
由于各Linux开发厂商的不同,因此不同开发厂商的Linux版本操作细节也不一样,今天就来说一下CentOS下JDK的安装: 方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创 ...