2017-03-15 3 views
0

In .Net-Core 1.1URI Abfrage-Zeichenfolge JsonSerializerSettings und Asp.Net Kern

Below Schnipsel funktioniert gut für die Eingabe/Ausgabe (Body) Format

// ConfigureServices

.AddJsonOptions(jsonOption => 
{ 
    jsonOption.SerializerSettings.ContractResolver = new DefaultContractResolver() 
    { 
    NamingStrategy = new SnakeCaseNamingStrategy(true, true) 
    }; 
}) 

ich erwarte für Abfragezeichenfolge auch gleiches Verhalten

Beispiel:

/url/GetData? System_name = intel & is_active = true

Api

public class SystemController : Controller 
{ 
    public List<string> GetData([FromQuery]string SystemName, FromQuery]bool IsActive) 
    { 
     Assert.Equals("intel", SystemName); 
     Assert.Equals(true, IsActive); 
     return null; 
    } 
} 

Jeder Vorschlag, wie kann ich String Modell binden mit Camelcase Abfrage zurück. Vielen Dank im Voraus

Auch Sie mich bitte, wenn Sie weitere Informationen benötigen

Antwort

0

:)

using System; 
using System.Globalization; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Http.Internal; 
using Microsoft.AspNetCore.Mvc.ModelBinding; 

namespace Application.ValueProviders 
{ 
    public class CamelCaseQueryStringValueProviderFactory : IValueProviderFactory 
    { 
     public Task CreateValueProviderAsync(ValueProviderFactoryContext context) 
     { 
      if (context == null) 
       throw new ArgumentNullException(nameof(context)); 
      return AddValueProviderAsync(context); 
     } 

     private async Task AddValueProviderAsync(ValueProviderFactoryContext context) 
     { 
      var collection = context.ActionContext.HttpContext.Request.Query 
       .ToDictionary(t => ToCamelCaseFromSnakeCase(t.Key), t => t.Value, StringComparer.OrdinalIgnoreCase); 

      var valueProvider = new QueryStringValueProvider(
       BindingSource.Query, 
       new QueryCollection(collection), 
       CultureInfo.InvariantCulture); 

      context.ValueProviders.Add(valueProvider); 
     } 

     private string ToCamelCaseFromSnakeCase(string str) 
     { 
      return str.Split(new[] { "_" }, 
       StringSplitOptions.RemoveEmptyEntries). 
       Select(s => char.ToUpperInvariant(s[0]) + s.Substring(1, s.Length - 1)). 
       Aggregate(string.Empty, (s1, s2) => s1 + s2); 
     } 
    } 
}