C# ASP.NET Core 2中的ModelBinder和日期
我的URL中的所有日期都采用以下格式: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日这样的日
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存在两次:)