2017-04-25 6 views
0

問題はQueryParamsオブジェクトがSnakeCase QueryParamsネットコア

 public async Task<IActionResult> Search (
     [FromQuery] ProjectFilterDto filterParams, 
     [FromQuery(Name = "page_size")] int pageSize = 10, 
     [FromQuery(Name = "page_index")] int pageIndex = 0) 

enter image description here

他のすべてのものは、FromBodyとレスポンスがヘビの場合の構文

スタートアップにある蛇のケースではないということです。

options.SerializerSettings.ContractResolver = new DefaultContractResolver() 
{ 
    NamingStrategy = new SnakeCaseNamingStrategy(true, true) 
}; 

FromQuery(名=「X」)を使用せずにヘビケースのようにProjectFilterDtoのようなクエリのparamsを作成する方法はありますか?

答えて

2

まず、指定された文字列をスネークケースバージョンに変換する拡張メソッドを作成します。この方法は次のステップで必要になります。

public static string ToSnakeCase(this string s) 
{ 
    if (string.IsNullOrWhiteSpace(s)) 
    { 
     return s; 
    } 

    s = s.Trim(); 

    var length = s.Length; 
    var addedByLower = false; 
    var stringBuilder = new StringBuilder(); 

    for (var i = 0; i < length; i++) 
    { 
     var currentChar = s[i]; 

     if (char.IsWhiteSpace(currentChar)) 
     { 
      continue; 
     } 

     if (currentChar.Equals('_')) 
     { 
      stringBuilder.Append('_'); 
      continue; 
     } 

     bool isLastChar = i + 1 == length, 
       isFirstChar = i == 0, 
       nextIsUpper = false, 
       nextIsLower = false; 

     if (!isLastChar) 
     { 
      nextIsUpper = char.IsUpper(s[i + 1]);      
      nextIsLower = !nextIsUpper && !s[i + 1].Equals('_'); 
     } 

     if (!char.IsUpper(currentChar)) 
     { 
      stringBuilder.Append(char.ToLowerInvariant(currentChar)); 

      if (nextIsUpper) 
      { 
       stringBuilder.Append('_'); 
       addedByLower = true; 
      } 

      continue; 
     } 

     if (nextIsLower && !addedByLower && !isFirstChar) 
     { 
      stringBuilder.Append('_'); 
     } 

     addedByLower = false; 

     stringBuilder.Append(char.ToLowerInvariant(currentChar)); 
    } 

    return stringBuilder.ToString(); 
} 

今、我々は上記で定義されToSnakeCase()拡張メソッドを使用してヘビ同棲クエリパラメータを探しカスタム値プロバイダーを作成することができます。我々はまた、私たちの価値プロバイダのファクトリを実装する必要が

public class SnakeCaseQueryValueProvider : QueryStringValueProvider, IValueProvider 
{ 
    public SnakeCaseQueryValueProvider(
     BindingSource bindingSource, 
     IQueryCollection values, 
     CultureInfo culture) 
     : base(bindingSource, values, culture) 
    { 
    } 

    public override bool ContainsPrefix(string prefix) 
    { 
     return base.ContainsPrefix(prefix.ToSnakeCase()); 
    } 

    public override ValueProviderResult GetValue(string key) 
    { 
     return base.GetValue(key.ToSnakeCase()); 
    } 
} 

public class SnakeCaseQueryValueProviderFactory : IValueProviderFactory 
{ 
    public Task CreateValueProviderAsync(ValueProviderFactoryContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException(nameof(context)); 
     } 

     var valueProvider = new SnakeCaseQueryValueProvider(
      BindingSource.Query, 
      context.ActionContext.HttpContext.Request.Query, 
      CultureInfo.CurrentCulture); 

     context.ValueProviders.Add(valueProvider); 

     return Task.CompletedTask; 
    } 
} 

唯一のことはやって左には、スタートアップクラスのConfigureServicesメソッドで値プロバイダーを登録することです。

public void ConfigureServices(IServiceCollection services) 
{ 
    services 
     .AddMvc(options => 
     { 
      options.ValueProviderFactories.Add(new SnakeCaseQueryValueProviderFactory()); 
     }) 
     .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver 
     { 
      NamingStrategy = new SnakeCaseNamingStrategy() 
     }); 
} 

私はここでそれをすべてについてのブログ記事を書いた:http://www.sorting.se/enable-snake-cased-query-parameters-in-your-restfull-asp-net-core-web-api/

+0

偉大な仕事を!これが解決策です –

関連する問題