我在cookie中存储了用户的区域性信息。我想在转换datetime
数据时使用区域性。
到目前为止,我已经能够针对 querystring 请求执行此操作,但是对于 form-urlencoded 和 json 请求,它始终使用服务器的区域性
对于查询字符串,我一直按照https://vikutech.blogspot.com/2017/05/elegantly-dealing-with-timezones-in-mvc-core-webapi.html所述使用以下代码:
public class DateTimeBinder: IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var valueProviderResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
if (string.IsNullOrEmpty(valueProviderResult.FirstValue))
{
return TaskCache.CompletedTask;
}
CultureInfo culture = GetCulturefromCookie();
DateTime datetime;
// if couldnot parse by user culture then parse by default culture
if (DateTime.TryParse(valueProviderResult.FirstValue, culture, DateTimeStyles.RoundtripKind, out datetime) || DateTime.TryParse(valueProviderResult.FirstValue, CultureInfo.CurrentCulture, DateTimeStyles.RoundtripKind, out datetime))
{
bindingContext.Result =
ModelBindingResult.Success(datetime);
}
else
{
// TODO: [Enhancement] Could be implemented in better way.
bindingContext.ModelState.TryAddModelError(
bindingContext.ModelName,
bindingContext.ModelMetadata
.ModelBindingMessageProvider.AttemptedValueIsInvalidAccessor(
valueProviderResult.ToString(), nameof(DateTime)));
}
return TaskCache.CompletedTask;
}
}
public class DateTimeBinderProvider: IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (context.Metadata.UnderlyingOrModelType == typeof(DateTime))
{
return new DateTimeBinder();
}
return null; // TODO: Find alternate.
}
}
在startup.cs
services.AddMvc(option=> option.ModelBinderProviders.Insert(0, new DateTimeBinderProvider()))
此代码的问题是if (context.Metadata.UnderlyingOrModelType == typeof(DateTime))
,不适用于类。我还试图使其成为全局绑定器,这样就不必在每个datetime属性中添加自定义属性。
我正在尝试针对.net核心1版本执行此操作,但也欢迎.net核心2版本。
更新: 如果您想自己尝试,请参见以下源代码。 https://github.com/ruchanb/AspNetCoreCultureModelBind