2016-09-28 41 views
7

çalışmıyor bağlayıcı ancak ispanyolca virgül kullanılır:Aspnet Çekirdek Ondalık I (İspanyolca) olmayan bir ingilizce yapılandırmayla çalışan bir aspnet çekirdek uygulaması varsa olmayan İngilizcesi Kültür

  • 10256,35 İngiliz
  • 10256,35 İspanyol

[HttpPost] 
public decimal Test(decimal val) 
{ 
    return val; 
} 

Ben postacı kullanmak ve bu sorun {val: 15.30} gibi bu harekete geçirici bir json gönderirseniz: eylem ardından val (çünkü 0 çalışmıyor bağlayıcı bir recives

ben bir denetleyici bu eylemi var kültür). Bu {val: 15,30} gibi bir json gönderirseniz eylem sonra 15.30 I olan sorun tarifesi ki girdiler tip metinden geliyor biçimidir, çünkü ben, virgül ile ondalık sayıları kabul etmek için harekete ihtiyaç uygulamanın formları. Ama aynı zamanda json formatında istek gelen bir nokta ile ondalık kabul etmek gerekir. Bir virgül kabul eden json'da ondalık/float belirtmenin bir yolu yoktur (dize olarak bir seçenek değildir). Bunu nasıl yapabilirim??? Kendimi çıldırtıyor bu yüzden.

Teşekkürler!

+0

Sen 'contentType' okuyan bir özel ModelBinder oluşturmak ve içerik türüne –

+0

içinde bağlı değeri ayrıştırmak gerekir MVC5 burada benzer bir çözüm bulabilir bir özel modeli cilt kullanılan ve mvc çekirdek için, sorunumu çözdü [özel Model ASP.Net Core Bağlama 1,0 (RTM)] (http://intellitect.com/custom-model-binding -in-asp-net-1-0 çekirdek /) – Ziyad

cevap

8

Görünüşe göre, ASP.NET çekirdek 1.0.0 bağlayıcı ondalık varsayılan kültür değişmez değildir. Model bağlama, sunucu kültürüne bağlıdır.

Stephen Muecke önerdiği gibi bağlayıcı bir özel model ile bu davranışı değiştirebilir. İşte maden Startup.cs Custom Model Binding in ASP.Net Core 1.0 (RTM)

public class InvariantDecimalModelBinderProvider : IModelBinderProvider 
{ 
    public IModelBinder GetBinder(ModelBinderProviderContext context) 
    { 
     if (context == null) throw new ArgumentNullException(nameof(context)); 

     if (!context.Metadata.IsComplexType && (context.Metadata.ModelType == typeof(decimal) || context.Metadata.ModelType == typeof(decimal?))) 
     { 
      return new InvariantDecimalModelBinder(context.Metadata.ModelType); 
     } 

     return null; 
    } 
} 

public class InvariantDecimalModelBinder : IModelBinder 
{ 
    private readonly SimpleTypeModelBinder _baseBinder; 

    public InvariantDecimalModelBinder(Type modelType) 
    { 
     _baseBinder = new SimpleTypeModelBinder(modelType); 
    } 

    public Task BindModelAsync(ModelBindingContext bindingContext) 
    { 
     if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext)); 

     var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     if (valueProviderResult != ValueProviderResult.None) 
     { 
      bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult); 

      var valueAsString = valueProviderResult.FirstValue; 
      decimal result; 

      // Use invariant culture 
      if (decimal.TryParse(valueAsString, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out result)) 
      { 
       bindingContext.Result = ModelBindingResult.Success(result); 
       return Task.CompletedTask; 
      } 
     } 

     // If we haven't handled it, then we'll let the base SimpleTypeModelBinder handle it 
     return _baseBinder.BindModelAsync(bindingContext); 
    } 
} 

üzerinde Ve dayanır:

services.AddMvc(config => 
{ 
    config.ModelBinderProviders.Insert(0, new InvariantDecimalModelBinderProvider()); 
}); 
+1

Sadece başkaları için sözler, bu kopyala/yapıştır negatif sayıları bağlayıcı duracaktır. Ondalıktan kaçınmak için.Çalışma için de stylesShiples.AllowLeadingSign stillerini ekleyin. NumberStyles.AllowLeadingSign eklemek için Düzenlenen bir çok – adopilot

+0

Teşekkürler. İyi yakalamak @adopilot –