首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dotnet核心webapi json-api兼容查询串路由

dotnet核心webapi json-api兼容查询串路由
EN

Stack Overflow用户
提问于 2016-11-12 18:12:34
回答 2查看 921关注 0票数 4

我试图从请求的URL中获取"status“和"all”键的值,但不知道如何构建我的类对象。

我所指的JSON API规范可以在这里找到:http://jsonapi.org/recommendations/#filtering

代码语言:javascript
复制
// requested url
/api/endpoint?filter[status]=all


// my attempt at model binding
public class FilterParams
{
    public Dictionary<string, string> Filter { get; set; }
}

[HttpGet]
public string Get([FromUri] FilterParams filter)
{
    // never gets populated...
    var filterStatus = filter.Filter["status"];
}
EN

回答 2

Stack Overflow用户

发布于 2018-07-25 22:28:16

如果您在.Net核心上构建json:api应用程序,我强烈建议您查看这个库:https://github.com/json-api-dotnet/JsonApiDotNetCore

它为您处理所有繁重的工作,对于这个特定的示例,(您需要获取筛选器值)解决方案如下所示:

代码语言:javascript
复制
public FooController : JsonApiController<Foo> {
    private readonly IQueryAccessor _queryAccessor;
    public FooController(IQueryAccessor queryAccessor, /* ... */) 
    : base(/* ... */) {
       _queryAccessor = queryAccessor;
    }

    [HttpGet]
    public override async Task<IActionResult> GetAsync() {
        var status = _queryAccessor.GetRequired<string>("status");
        // ...
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-11-15 22:06:50

  1. 你可以用IModelBinder来实现:

代码语言:javascript
复制
- Define a model binder:

公有类FilterParamsModelBinder : IModelBinder { public bool BindModel(HttpActionContext actionContext,ModelBindingContext bindingContext) { if (bindingContext.ModelType != typeof(FilterParams)) return false;Dictionary result =FilterParams Dictionary();var参数=DictionaryDictionary)]=(?\W^,+)");参数组(‘&’) .ToList() .ForEach(_ => { var groups = regex.Match(_).Groups;if(groups.Count == 0) var "Cannot convert value.");result.Add(groups"key".Value,groups"value".Value);});bindingContext.Model =新筛选器{ FilterParams = result};bindingContext.ModelState.IsValid;}}

-使用它:

HttpGet公共字符串Get(ModelBinderAttribute(typeof(FilterParamsModelBinder)) FilterParams ){//您的代码}

  1. 如果您可以定义一个类似“/api/?
    1. =status,all”的路由,那么您可以使用TypeConverter

代码语言:javascript
复制
- Define a converter:

公共类FilterConverter : TypeConverter { public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo区域性,object value) { if (!(value is string)) return base.ConvertFrom(context,区域性,value);var keyValue = ((string)value).Split(',');return new FilterParams { Filter =CultureInfo Dictionary { [keyValue] = keyValue1 } };}公共重写bool CanConvertFrom(ITypeDescriptorContext context,类型sourceType) { return sourceType == typeof(string) || base.CanConvertFrom(context,sourceType);}}

-使用它:

TypeConverter(typeof(FilterConverter))公共类FilterParams {公共Dictionary Filter { get;set;}} HttpGet公共字符串Get(FilterParams filter) { var filterStatus = filter.Filter"status";}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40561781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档