我试图从请求的URL中获取"status“和"all”键的值,但不知道如何构建我的类对象。
我所指的JSON API规范可以在这里找到:http://jsonapi.org/recommendations/#filtering
// 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"];
}发布于 2018-07-25 22:28:16
如果您在.Net核心上构建json:api应用程序,我强烈建议您查看这个库:https://github.com/json-api-dotnet/JsonApiDotNetCore
它为您处理所有繁重的工作,对于这个特定的示例,(您需要获取筛选器值)解决方案如下所示:
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");
// ...
}
}发布于 2016-11-15 22:06:50
- 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 ){//您的代码}
- 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";}
https://stackoverflow.com/questions/40561781
复制相似问题