c# – dotnet核心webapi json-api兼容的查询字符串路由
发布时间:2020-12-15 22:37:25 所属栏目:百科 来源:网络整理
导读:我试图从请求的URL中获
我试图从请求的URL中获取“status”和“all”键值,并且无法弄清楚如何构建我的类对象.
我所指的JSON API规范可以在这里找到: // 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"]; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |