在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请求参数传入输入带有[]不识别问题》的更多相关文章

  1. .NET Core 迁移躺坑记

    最近将自己负责的一个核心接口系统从.Net Framework迁移到了.Net Core. 整体过程,从业务层面说一般般吧(整体还好但还是搞的业务有感,没出严重故障)但是技术层面上感觉其实并没有达到要 ...

  2. .NET Core 迁移躺坑记续集--Win下莫名其妙的超时

    继上一集里说到遇到的各种问题并且弄了n个解决方案之后,特别是对于问题4的解决方案对于切换了HttpClientFactory 我用了你家netcore 2.1下专门解决之前HttpClient口病已久 ...

  3. .Net Core 迁移之坑二 《ToString("F") 输出与windows不一致问题》

    大家都知道 ToString("F") 是干什么的 这里我还是介绍一下 格式字符串采用以下形式:Axx,其中 A 为格式说明符,指定格式化类型,xx 为精度说明符,控制格式化输出的 ...

  4. .NET CORE迁移踩坑

    https://www.cnblogs.com/leolaw/p/10740678.html

  5. Asp.net webapi 判断请求参数是否为空简易方法 Model Validation 判断请求参数是否为空

    通常情况下,对于那些经常为别人提供数据接口的开发人员来说,对于调用方传递过来的参数都会有验证处理.例如: if (string.IsNullOrEmpty(entity.Name)) { //当姓名为 ...

  6. webapi 获取请求参数

    //获取请求消息提数据 Stream stream = filterContext.Request.Content.ReadAsStreamAsync().Result; Encoding encod ...

  7. ASP.Net Core开发(踩坑)指南

    ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET MVC应用迁移到ASP.NE ...

  8. 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 ...

  9. .Net Core迁移到MSBuild平台(二)

    一.前言 在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下新的项目配置文件中的节点配置,这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程 ...

随机推荐

  1. SurfaceView基本使用--动态画正弦函数

    package com.zzw.TestSurfaceView; import android.content.Context; import android.graphics.Canvas; imp ...

  2. hibernate12--注解

    在之前的基础上删除hbm.xml映射文件 之后修改实体类内容 /** * 部门的实体类 * strategy对应的就是主键生成策略 * GenerationType: * 01.auto:自动选择合适 ...

  3. Apk大瘦身

    Android的apk文件越来越大了这已经是一个不争的事实.在Android 还是最初版本的时候,一个app的apk文件大小也还只有2 MB左右,到了现在,一个app的apk文件大小已经升级到10MB ...

  4. 牛客国庆集训派对Day1:J:Princess Principal(栈模拟求括号匹配)

    题目描述 阿尔比恩王国(the Albion Kingdom)潜伏着一群代号“白鸽队(Team White Pigeon)”的间谍.在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没 ...

  5. MySql必知必会实战练习(五)存储过程

    1. 为什么使用存储过程? (1) 通过把处理封装在容易使用的单元中,简化复杂操作 (2) 为了保证数据的完整性,不要求反复建立一系列的处理操作,所有开发人员和应用程序都使用同一(试验和测试)存储过程 ...

  6. 你该了解的10个 Python 模块

    Python很优雅.使用以下模块有助于保持你的代码整洁.易于维护.欢迎补充. Docopt.忘了optparse和argparse吧,使用docstring来构建优雅的.高可读性.复杂(如果你有这个需 ...

  7. WPF 自定义DateControl DateTime控件(转)

    自定义日期控件,月份选择.如下是日期的一些效果图. 具体的样式.颜色可以根据下面的代码,自己调节即可    1.日期控件的界面 <UserControl x:Class="WpfApp ...

  8. 【HTML5】Canvas绘图详解-1

    ----->Canvas绘制基础 1,线条绘制 1-1,线条组成的图形和beginPath 案例:绘制由不同颜色的线条组成的图案 1-2,多边形的填充和closePath 案例:绘制封闭具有填充 ...

  9. VBA程序的调试

    VBA程序的调试:设置断点.单步跟踪.设置监视窗 Acces的VBE编程环境提供了完整的一套调试工具和调试方法.熟练掌握好这些调试工具和调试方法的使用,可以快速.准确地找到问题所在,不断修改,加以完善 ...

  10. Linux环境安装nginx

    安装需要以下工具: yum -y install gcc gcc-c++ autoconf automake 模块依赖: yum -y install zlib zlib-devel openssl ...