【问题标题】:Web api parse FromQuery parameter nameWeb api 解析 FromQuery 参数名称
【发布时间】:2021-02-03 09:50:16
【问题描述】:

我有严格的 API 路由要求。这必须是 Get 请求,并且不能更改路由。用户可以按姓名搜索人,但也可以按姓名的一部分进行搜索:

api/People?name=Tom - “Tom”可以出现在姓名的任何部分,忽略大小写

api/People?name:contains=Tom - “Tom”必须在名称的开头,忽略大小写

api/People?name:exact=Tom - “Tom”必须区分大小写

在控制器中应该如何实现?

有3个参数的选项,可以改进吗?

    public async Task<IActionResult> GetByName(
        [FromQuery(Name = "name")] string name, 
        [FromQuery(Name = "name:contains")] string beginName, 
        [FromQuery(Name = "name:exact")] string exactName)

【问题讨论】:

  • 我可以建议“public HttpResponseMessage Post([FromBody]FormDataCollection formbody)”。查看此链接了解详情docs.microsoft.com/en-us/aspnet/web-api/overview/…
  • 谢谢,很遗憾,这必须是一个获取请求,并且该解决方案不适合我。我更正了描述
  • 我将使用nameoperator这样的两个参数。

标签: c# rest asp.net-core asp.net-web-api .net-core


【解决方案1】:

您可以使用自定义模型绑定,这是一个演示: 名称型号:

public class NameModel {
        public string name { get; set; }
        public string beginName { get; set; }
        public string exactName { get; set; }
    }

控制器:

        [Route("/GetByName")]
        public async Task<IActionResult> GetByName([ModelBinder(typeof(NameBinder))]NameModel nameModel)
        {
            return Ok();
        }

名称绑定器:

 public class NameBinder:IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null)
            {
                throw new ArgumentNullException(nameof(bindingContext));
            }
            var model1 = new NameModel();
            var name=bindingContext.ValueProvider.GetValue("name").FirstValue;
            var beginName = bindingContext.ValueProvider.GetValue("name:contains").FirstValue;
            var exactName = bindingContext.ValueProvider.GetValue("name:exact").FirstValue;
            if (name.ToLower().Contains("tom")) {
                model1.name = name;
            }
            if (beginName.ToLower().StartsWith("tom")) {
                model1.beginName = beginName;
            }
            if (exactName.Contains("Tom")) {
                model1.exactName = exactName;
            }
            bindingContext.Result = ModelBindingResult.Success(model1);
            return Task.CompletedTask;
        }
    }

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2010-10-26
    • 2011-10-05
    相关资源
    最近更新 更多