2016-09-28 9 views
7

に取り組んでいないバインディング私は、英語以外の構成(スペイン語)で実行ASPNETコアアプリを持っている:英語でASPNETコア進が非英語文化

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     ...... 
     app.UseRequestLocalization(new RequestLocalizationOptions 
     { 
      DefaultRequestCulture = new RequestCulture(new CultureInfo("es-AR")) 
      ,SupportedCultures = new List<CultureInfo> 
      { 
       new CultureInfo("es-AR") 
      } 
      ,SupportedUICultures = new List<CultureInfo> 
      { 
       new CultureInfo("es") 
      } 
     }); 

     ......... 
    } 

進数は、ドットで区切られたその小数部を持っていますしかし、スペイン語にカンマが使用されます。

  • 10256.35英語
  • 10256,35スペイン語

Iはコントローラでこの作用を有する:

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

私は郵便配達を使用して、そのアクションには、この{ヴァル:15.30}のようなJSONを送信する場合、アクションにvalが0(ための動作していない結合recivesを文化)。私がこのようなjsonを送信すると{val:15,30}、次に私が受け取るアクションで15.30 問題は私がカンマで小数点を受け入れるアクションが必要なことです。アプリのフォーム。しかし、私はまたjson形式の要求から来るドットで10進数を受け入れる必要があります。コンマを受け入れるjsonの小数点/浮動小数点数を指定する方法はありません(文字列はオプションではないので送信します)。これどうやってするの???私は私の自己をこれで狂った運転しています。

ありがとうございます!

+0

あなたは 'contentType'を読み込むカスタムModelBinderを作成し、コンテンツの種類 –

+0

に応じた値を解析する必要がありますMVC5私はカスタムモデルのバインダーを使用し、それは私の問題を解決しました.MVCコアの場合、類似の解決策が見つかるかもしれません。[ASP.Net Core 1.0(RTM)のカスタムモデルバインディング](http://intellitect.com/custom-model-binding -in-asp-net-core-1-0 /) – Ziyad

答えて

8

明らかに、ASP.NETコア1.0.0での小数点のバインディングは、既定ではカルチャ不変ではありません。モデルのバインディングはサーバーの文化に依存します。

この動作は、Stephen Mueckeの推奨するカスタムモデルバインドで変更できます。ここで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); 
    } 
} 

そしてStartup.cs中に基づいて私のものです:

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

このコピー/ペーストでは、他の人には注意してください。これを避けるにはdecimal.TryParseスタイルにnumberStyles.AllowLeadingSignも追加します。 Thanx a lot – adopilot

+0

NumberStyles.AllowLeadingSignを追加するように編集しました。良いキャッチ@adopilot –

関連する問題