gpt4 book ai didi

asp.net-mvc - 如何使 ASP.Net MVC 模型绑定(bind)器将传入日期视为 UTC?

转载 作者:行者123 更新时间:2023-12-03 00:01:05 28 4
gpt4 key购买 nike

我正在将一个对象发布到 MVC Controller 。该对象包含一个名为 StartDt 的字段,在客户端上它是本地时间的 javascript Date 对象。

当我在对象上调用 JSON.stringify 并使用 jQuery 的 ajax 方法将其 POST 到服务器时,我可以在 Firebug 中看到发送到服务器的 ISO 字符串,例如“1900-12-31T13:00:00.000Z” "我认为应该是 UTC 格式的本地时间。

当我查看 Controller 中的 DateTime 字段时,它看起来像是回到本地时间而不是 UTC。我该如何解决这个问题?

我想存储来自客户端的日期的 UTC 版本。

最佳答案

此问题在 ASP.NET Core 2.0 中仍然存在。以下代码将解决该问题,支持 ISO 8601 基本和扩展格式,正确保留值并正确设置 DateTimeKind。这与 JSON.Net 解析的默认行为一致,因此它使您的模型绑定(bind)行为与系统的其余部分保持一致。

首先,添加以下模型绑定(bind)器:

public class DateTimeModelBinder : IModelBinder
{
private static readonly string[] DateTimeFormats = { "yyyyMMdd'T'HHmmss.FFFFFFFK", "yyyy-MM-dd'T'HH:mm:ss.FFFFFFFK" };

public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
throw new ArgumentNullException(nameof(bindingContext));

var stringValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).FirstValue;

if (bindingContext.ModelType == typeof(DateTime?) && string.IsNullOrEmpty(stringValue))
{
bindingContext.Result = ModelBindingResult.Success(null);
return Task.CompletedTask;
}

bindingContext.Result = DateTime.TryParseExact(stringValue, DateTimeFormats,
CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var result)
? ModelBindingResult.Success(result)
: ModelBindingResult.Failed();

return Task.CompletedTask;
}
}

然后添加以下模型绑定(bind)器提供程序:

public class DateTimeModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));

if (context.Metadata.ModelType != typeof(DateTime) &&
context.Metadata.ModelType != typeof(DateTime?))
return null;

return new BinderTypeModelBinder(typeof(DateTimeModelBinder));
}
}

然后在您的 Startup.cs 文件中注册提供程序:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
...

options.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());

...
}
}

关于asp.net-mvc - 如何使 ASP.Net MVC 模型绑定(bind)器将传入日期视为 UTC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10293440/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com