如何使 ASP.Net MVC 模型绑定器将传入日期视为 UTC?

2024-04-05

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

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

但当我查看控制器中的 DateTime 字段时,它看起来像是回到本地时间而不是 UTC。我怎样才能解决这个问题?

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


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

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

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;
    }
}

然后添加以下模型绑定程序提供程序:

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 file:

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

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

        ...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 ASP.Net MVC 模型绑定器将传入日期视为 UTC? 的相关文章

随机推荐

  • 有选择地删除上传到 Azure blob 的图像(Django/Python 项目)

    在 Django Python 项目中 我使用 Azure blob 来存储用户上传的照片 代码如下 from azure storage blob import BlobService blob service BlobService a
  • Maven 依赖项未下载,代理问题?

    当前 WinHTTP 代理设置 在 Windows 计算机中直接访问 无代理服务器 并在 settings xml 中作为 但是 jar 没有被下载并出现以下错误 ERROR Plugin org apache maven plugins
  • 使用 Rhohub 构建的 .apk 文件无法在设备上运行

    在我的设备中安装 apk 文件后 当我尝试打开它时 它说不幸的是应用程序已停止 它在我的 Rhomobile 的 Android Rhosimulator 上运行良好 但我不明白为什么它这么说 更新 今天 我在本地计算机上构建了 apk 文
  • 正则表达式/“正则表达式”中的正则是什么意思?

    正则表达式 中的 正则 是什么意思 我听说正则表达式曾经是常规的 但现在不再了 The regular正则表达式中来自于它匹配常规语言 http en wikipedia org wiki Regular language 的概念形式语言理
  • pthread_create 中的多个参数

    根据 pthread create 手册页 该函数的参数是 int pthread create pthread t thread const pthread attr t attr void start routine void void
  • 如何在 Micronaut 应用程序中指定配置文件?

    我想根据我将部署应用程序的环境指定不同类型的配置 就像在Spring boot中的yml文件中我们可以设置配置文件一样 我想知道是否有办法在Micronaut中做到这一点 您可以通过以下方式设置活动环境系统属性 micronaut envi
  • 更改占位符文本

    如何更改输入元素的占位符文本 例如我有 3 个文本类型的输入
  • 如何将 GitHub wiki 存储为源代码的一部分

    GitHub 以及许多git服务器 例如 GitLab 提供项目级 wiki 其中通常包含 markdown md 文件被存储并形成 好吧 你的项目的wiki 这将是so cool如果有一种方法可以将您的 wiki 存储为主项目源代码的一部
  • 使用 jQuery 进行 .NET 日期验证

    我需要对日期进行一些基本验证 例如验证日期是否大于今天 验证日期是否真实 即99 99 9999 等 基本上 我需要模拟 NET 的用途DateTime TryParse jQuery 中有类似的东西吗 或者我最好进行 AJAX 调用来验证
  • socket.io 解析连接 (>= 2.4.1) 签名的会话 cookie

    使用最新版本的 connect 截至 2012 年 7 月 26 日 我找到了以下方法来从 socket io 获取可与 connect redis 存储一起使用的会话 ID var express require express rout
  • ARKit - 获取相机到锚点的距离

    我正在创建一个锚点并将其添加到相机前面一定距离处的 ARSKView 中 如下所示 func displayToken distance Float print token dropped at distance guard let sce
  • Android 中的静态单例生命周期

    我有一些不清楚的情况 最后一个持有 Activity 的引用被销毁后 静态单例会被垃圾回收吗 因为Application中没有更多对单例实例的引用 那么我可以依赖单身人士吗 由官方提供安卓文档 http developer android
  • Firefox 中的 SVG 过滤器

    由于某些原因 我无法让我的 SVG 过滤器在 Firefox 中工作 然而它们在 Opera 中工作得很好 我将其属性设置为过滤器的元素就消失了 这很奇怪 这是我的 JavaScript 代码 defsElement SVGDoc crea
  • 禁用在发布设置上将诊断数据发送到应用程序见解

    我在 vs2013 上创建了一个 Web 角色 最近将其升级到 vs2015 将角色发布到 Azure 时 send diagnostics data to application insights已打开 由于我不想每次都使用应用程序见解
  • 在 Scalatest 失败时执行专门的功能

    我正在使用 selenium 在 Scala Web 应用程序上执行集成测试 每当测试失败时 我想将页面的 html 截图或打印到控制台中 我当前的设置是使用 Selenium 2 0 和 Spec 进行 Scalatest 是否有办法通过
  • 迁移php4/mysql4到php5/mysql5:切换到InnoDB?

    我有一个遗留的Web应用程序php4 mysql4 MyISAM 数据库包含一些cms 一些用户数据 一些日历应用程序 现在我要迁移到带有 php5 mysql5 的新服务器 迁移mysql数据库时是否应该更改为InnoDB 预期的优点 缺
  • 使用正则表达式和 php 删除除 Internet Explorer 注释之外的所有 html 注释

    我是正则表达式新手 但需要一个可以删除所有 html 注释的代码 但不是像 我有这个代码 第369章
  • 保存“微调”的 bert 模型

    我正在尝试保存一个经过微调的 bert 模型 我已经正确运行了代码 它工作正常 并且在 ipython 控制台中我可以调用 getPrediction 并让它产生结果 我保存了体重文件 最高的是 model ckpt 333 data 00
  • 将 XElement 转换为字符串

    我有一个简单的 XElement 对象 XElement xml new XElement XML new XElement TOKEN Session Token new XElement ALL INCLUSIVE 0 new XEle
  • 如何使 ASP.Net MVC 模型绑定器将传入日期视为 UTC?

    我正在将一个对象发布到 MVC 控制器 该对象包含一个名为 StartDt 的字段 在客户端上它是本地时间的 javascript Date 对象 当我对对象调用 JSON stringify 并使用 jQuery 的 ajax 方法将其