まず、指定された文字列をスネークケースバージョンに変換する拡張メソッドを作成します。この方法は次のステップで必要になります。
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/
偉大な仕事を!これが解決策です –