2017-11-21 10 views
1

URLの日付はすべてdd-MM-yyyyの形式です。例:31-12-2017ModelBinderとASP.NETコア2の日付

は現在、私のWeb APIは、問題は私のウェブAPIを米国英語でフォーマットされた日付でのみ動作思われることである。この

[HttpGet] 
public Task<IAsyncResult> GetSomething([FromQuery] date) 
{ 
    ... 
} 

のような方法があります。

  • のような日付は、12-31-2017となります。
  • 31-12-2017のような日付は動作しません。

私のカスタムデータ形式をクエリから注入されたパラメータにバインドする方法を教えてください。

+0

これをチェックしたいかもしれません。 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware?tabs=aspnetcore2x –

答えて

1

startup.csでASPコア2.0のためにこれを提出アム追加このモデルは、形式ddを受け入れる結合するであろう

  services.Configure<RequestLocalizationOptions>(
      opts => 
      { 
       var supportedCultures = new List<CultureInfo> 
       { 

         new CultureInfo("en-GB"), 
         new CultureInfo("ar") 
       }; 


       opts.DefaultRequestCulture = new RequestCulture("en-GB"); 
       // Formatting numbers, dates, etc. 
       opts.SupportedCultures = supportedCultures; 
       // UI strings that we have localized. 
       opts.SupportedUICultures = supportedCultures; 
       opts.DefaultRequestCulture = new RequestCulture(culture: "en-GB", uiCulture: "en-GB"); 


      }); 

は/ MM/YYY

2

カスタムモデルバインダーを使用してこれを実行できます。ここでサンプルコードである:

public class DateTimeModelBinder : IModelBinder 
{ 
    private readonly IModelBinder baseBinder = new SimpleTypeModelBinder(typeof(DateTime)); 

    public Task BindModelAsync(ModelBindingContext bindingContext) 
    { 
     var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (valueProviderResult != ValueProviderResult.None) 
     { 
      bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult); 

      var valueAsString = valueProviderResult.FirstValue; 

      // valueAsString will have a string value of your date, e.g. '31-12-2017' 
      // Parse it as you need and build DateTime object 
      var dateTime = DateTime.ParseExact(valueAsString, "dd-MM-yyyy", CultureInfo.InvariantCulture); 
      bindingContext.Result = ModelBindingResult.Success(dateTime); 

      return Task.CompletedTask; 
     } 

     return baseBinder.BindModelAsync(bindingContext); 
    } 
} 

[HttpGet] 
public Task<IAsyncResult> GetSomething([FromQuery] [ModelBinder(typeof(DateTimeModelBinder))] date) 
{ 
    ... 
} 
関連する問題