【问题标题】:Specifying a date format for binding date property in a model in web api在 web api 的模型中为绑定日期属性指定日期格式
【发布时间】:2019-12-04 04:43:04
【问题描述】:

我的 api 中有一个包含 id 和 DateTime 属性的类。

public class MyTestClass
    {
        public int id { get; set; }
        public DateTime dateTime { get; set; }

    }

我想知道是否有办法只接受具有特定日期格式的 JSON 字符串。 我的问题是模型绑定器将解析“21-01-1991”和“01-21-1991”。

示例 API 控制器

public void Post(MyTestClass myTest)
        {
            DateTime x = myTest.dateTime;
        }

如果用户以除 iso 8601 格式以外的任何格式发送 dateTime 属性,我希望 api 返回错误请求。

【问题讨论】:

  • 我认为您可能需要显示“模型绑定器”的相关代码(但不是整个程序,足以显示您正在使用的方法)。另外从您的问题中很难判断,但我认为您期望 JSON 字符串应该代表 ISO 8601 中的日期,但是您看到的值是“21-01-1991”和“01-21-1991”解析器无论如何都会尝试解析。
  • 我目前没有模型活页夹,我试图写一个,但我认为必须有一种更简单的方法或配置(如序列化设置),允许指定日期格式可以解析。我为 DateTime 参数构建了一个模型活页夹,但我无法让它适用于包含日期时间属性的类,并且我不想为每个类创建一个特定的活页夹。我正在寻找一些可以处理这个问题的全局设置。

标签: c# api datetime model-binding


【解决方案1】:

暂时不要太分心,让我们看一个非常简单的解决方案。

设置一些常量来表示您希望字符串采用的格式。反序列化数据并将 JSON 值存储为字符串。不要试图强制源字符串数据采用任何特定的日期格式、ISO 或其他格式。然后,当您需要它时,使用 get 属性将数据解析为 DateTime 对象。

public class MyTestClass
{
    public const string DATETIME_FORMAT = "MM-DD-YYYY";
    public int id { get; set; }
    public string dateTime { get; set; }
    public DateTime dateTimeConverted
    {
        get
        {
            string[] parts = dateTime.Split('-');
            int year, month, day;

            if (DATETIME_FORMAT == "MM-DD-YYYY")
            {
                year = Int32.Parse(parts[2]);
                month = Int32.Parse(parts[0]);
                day = Int32.Parse(parts[1]);   
            }
            else if (DATETIME_FORMAT == "DD-MM-YYYY")
            {
                year = Int32.Parse(parts[2]);
                month = Int32.Parse(parts[1]);
                day = Int32.Parse(parts[0]); 
            }

            return new DateTime(year, month, day);
        }
    }

【讨论】:

  • 我不喜欢在我的 api 中有一个代表日期的字符串字段。您认为可能有更好的方法来拦截绑定过程并检索将转换为日期的实际文本?
  • 如果您愿意,请随意打开那罐蠕虫。
【解决方案2】:

我可以通过定义序列化设置日期格式来解决这个问题。我不知道为什么我第一次尝试它时不起作用。

我刚刚将以下内容添加到 .net 核心 api 中的 startup.cs

services.AddMvc()
        .AddJsonOptions(options =>
        {
            options.SerializerSettings.DateFormatString = "yyyy-MM-ddTHH:mm:ssZZZ";
            options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;                
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2016-03-08
    • 2012-12-13
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多