我试图从请求的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"]; }
解决方法
>您可以使用
IModelBinder:
>定义模型绑定器:
public class FilterParamsModelBinder : IModelBinder { public bool BindModel(HttpActionContext actionContext,ModelBindingContext bindingContext) { if (bindingContext.ModelType != typeof(FilterParams)) return false; Dictionary<string,string> result = new Dictionary<string,string>(); var parameters = actionContext.Request.RequestUri.Query.Substring(1); if(parameters.Length == 0) return false; var regex = new Regex(@"filter\[(?<key>[\w]+)\]=(?<value>[\w^,]+)"); parameters .Split('&') .ToList() .ForEach(_ => { var groups = regex.Match(_).Groups; if(groups.Count == 0) bindingContext.ModelState.AddModelError(bindingContext.ModelName,"Cannot convert value."); result.Add(groups["key"].Value,groups["value"].Value); }); bindingContext.Model = new FilterParams { Filter = result}; return bindingContext.ModelState.IsValid; } }
>使用它:
[HttpGet] public string Get([ModelBinderAttribute(typeof(FilterParamsModelBinder))] FilterParams filter) { //your code }
>如果您可以定义一个类似“/ api / endpoint?filter = status,all”的路由,那么您可以使用TypeConverter:
>定义转换器:
public class FilterConverter : TypeConverter { public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,object value) { if (!(value is string)) return base.ConvertFrom(context,culture,value); var keyvalue = ((string)value).Split(','); return new FilterParams { Filter = new Dictionary<string,string> { [keyvalue[0]] = keyvalue[1] } }; } public override bool CanConvertFrom(ITypeDescriptorContext context,Type sourceType) { return sourceType == typeof(string) || base.CanConvertFrom(context,sourceType); } }
>使用它:
[TypeConverter(typeof(FilterConverter))] public class FilterParams { public Dictionary<string,string> Filter { get; set; } } [HttpGet] public string Get(FilterParams filter) { var filterStatus = filter.Filter["status"]; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。