C# ASP.NET Core 2中的ModelBinder和日期

C# ASP.NET Core 2中的ModelBinder和日期,c#,asp.net,date,asp.net-core-mvc,asp.net-core-2.0,C#,Asp.net,Date,Asp.net Core Mvc,Asp.net Core 2.0,我的URL中的所有日期都采用以下格式:dd-MM-yyyy。示例:2017年12月31日 目前,我的Web API有这样一种方法 [HttpGet] public Task<IAsyncResult> GetSomething([FromQuery] date) { ... } [HttpGet] 公共任务GetSomething([FromQuery]日期) { ... } 问题是,我的Web API似乎只适用于格式为美国英语的日期 像2017年12月31日这样的日

我的URL中的所有日期都采用以下格式:
dd-MM-yyyy
。示例:2017年12月31日

目前,我的Web API有这样一种方法

[HttpGet]
public Task<IAsyncResult> GetSomething([FromQuery] date) 
{
    ...
}
[HttpGet]
公共任务GetSomething([FromQuery]日期)
{
...
}
问题是,我的Web API似乎只适用于格式为美国英语的日期

  • 像2017年12月31日这样的日期将有效
  • 而像2017年12月31日这样的日期是行不通的

如何将查询中的自定义数据格式绑定到注入的参数?

您可以使用自定义模型绑定器来完成此操作。下面是一个示例代码:

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) 
{
    ...
}
公共类DateTimeModelBinder:IModelBinder { private readonly IModelBinder baseBinder=new SimpleTypeModelBinder(typeof(DateTime)); 公共任务BindModelAsync(ModelBindingContext bindingContext) { var valueProviderResult=bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 如果(valueProviderResult!=valueProviderResult.None) { bindingContext.ModelState.SetModelValue(bindingContext.ModelName,valueProviderResult); var valueAsString=valueProviderResult.FirstValue; //valueAsString将具有您日期的字符串值,例如“31-12-2017” //根据需要解析它并构建DateTime对象 var dateTime=dateTime.ParseExact(valueAsString,“dd-MM-yyyy”,CultureInfo.InvariantCulture); bindingContext.Result=ModelBindingResult.Success(dateTime); 返回Task.CompletedTask; } 返回baseBinder.BindModelAsync(bindingContext); } } [HttpGet] 公共任务GetSomething([FromQuery][ModelBinder(typeof(DateTimeModelBinder))]date) { ... }
我正在startup.cs add中为ASP core 2.0提交此文件

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

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


                // 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");


            });
服务。配置(
选项=>
{
var supportedCultures=新列表
{
新文化信息(“en GB”),
新文化信息(“ar”)
};
//格式化数字、日期等。
opts.SupportedCultures=SupportedCultures;
//我们已经本地化的UI字符串。
opts.supporteduccultures=支持的文化;
opts.DefaultRequestCulture=新的RequestCulture(区域性:“en-GB”,uiCulture:“en-GB”);
});

这将使模型绑定接受dd/MM/yyy格式

您可能需要检查此格式。不确定为什么opts.DefaultRequestCulture存在两次:)