DateTime输入用于从用户区域性而非服务器区域性反序列化。 ASP.NET核心

时间:2019-05-02 11:05:47

标签: c# datetime asp.net-core

我在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

0 个答案:

没有答案