.NET Core WebAPI Get请求参数传入输入不识别问题

参考了:https://www.cnblogs.com/zhaozhengyan/p/aspnet-core-webapi-array-handle.html

①.NET Core WebApi项目里添加一个 ArraryHandleQueryConvention.cs 类文件,其内容如下:

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 JYJTSYSTEM.API
{
    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(0, _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(0, new ArrayQueryStringValueProvider(_key, context.ActionContext.HttpContext.Request.Query));
            return Task.CompletedTask;
        }
    }
}

②修改 Startup.cs 里的 public void ConfigureServices(IServiceCollection services) 函数,如下:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(o =>
            {
                o.Conventions.Add(new ArraryHandleQueryConvention());
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

③就能访问带参数的Get调用了

      //https://localhost:44377/API/Demo/TestApi/GetUrlStrApi?str=abc123        
        [HttpGet]
        public ApiBaseResult GetUrlStrApi(string str)
        {
           return ReturnApiBaseResult(str);
        }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值