加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – dotnet核心webapi json-api兼容的查询字符串路由

发布时间:2020-12-15 22:37:25 所属栏目:百科 来源:网络整理
导读:我试图从请求的URL中获
我试图从请求的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"]; 
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读