在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. Java中的深拷贝(深复制)和浅拷贝(浅复制)

    深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复 ...

  2. react privateRoute

    import React from 'react'; import PropTypes from 'prop-types'; import {Route,Redirect,withRouter} fr ...

  3. Python基础学习(第5天)

    第3课  模块 1.模块(module) Python中一个.py文件就是一个模块,可以调用其它文件中的程序. 例:first.py def laugh(): print '哈哈哈哈哈' second ...

  4. 通过TortoiseSVN checkout的文件前面没有“状态标识”

    问题描述:安装完成VisualSVN Server.VisualSVn和TortoiseSVN后,然后通过SVN Server新建Repository(仓库),用Visual Studio新建一个So ...

  5. 内存管理(1)-buddy和slub算法

    Linux内存管理是一个很复杂的系统,也是linux的精髓之一,网络上讲解这方面的文档也很多,我把这段时间学习内存管理方面的知识记录在这里,涉及的代码太多,也没有太多仔细的去看代码,深入解算法,这篇文 ...

  6. Java 使用 long 出现空指针异常

    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Neue'; color: #454545} p.p2 {margin: ...

  7. 从无到有开发自己的Wordpress博客主题---Wordpress主题的构造

    在这篇教程中,主要是对Wordpress的主题的构造进行分析,以方便今后的开发工作. 本来打算就引用一下别人已经有的文档就好了,但还是想从头到尾捋一遍,也方便自己梳理学习. 1.Wordpress主题 ...

  8. ORM 模型层

    一个模型就是一个单独的,确定的数据的信息源,包含了数据的字段和操作方法.通常,每个模型映射为一张数据库中的表 基本原则: 每个模型在Django中的存在形式为一个python类 每个模型都是djang ...

  9. (五)js数组方法二

    一:数组方法 var arr = []; 1.arr.push()//给数组末尾<添加>元素 2.arr.unshift()//给数组头部<添加>元素 3.arr.shift( ...

  10. not

    x = [] print(x) print(not x) print(x is None) print(not x is None) print(x is not None)