【问题标题】:Posting Date to Asp.net core API将日期发布到 Asp.net 核心 API
【发布时间】:2019-04-12 20:10:30
【问题描述】:

我正在使用 asp.net core web API 2.1。我正在向邮递员发送请求。我正在发送“10.12.2019”。但是,我从我的 controller.cs 得到“12.10.2019”。我该如何解决这个错误?

MyController.cs

[HttpPost]
public void MyMethod([FromBody]MyClass myClass)
{
}

public class MyClass {
    public DateTime myDate { get; set; }
}

我的请求

http://localhost:5012/api/MyController/MyMethod

我的 json

{
  "myDate": "10.12.2019"
}

我的 startup.cs

  services.Configure<RequestLocalizationOptions>(options =>
       {
           options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("tr-TR");
           options.SupportedCultures = new List<CultureInfo> { new CultureInfo("tr-TR") };
       });

【问题讨论】:

  • 尝试以 yyyy-MM-dd 格式发送。
  • 后文化不可知的日期值
  • 我想从 c# @Farshan 解决。我不想更改我发送的 JSON 对象。
  • 我不明白@VidmantasBlazevicius。你能解释一下吗?
  • @HasanOzdemir 您需要发送有效的日期格式或读取为字符串并自己解析

标签: c# asp.net-core-webapi


【解决方案1】:

如果您想更改您的服务使用的文化,那么您可以在Startup.cs 中进行设置,并将其添加到Configure() 方法中。

这对我有用(在app.UseMVC() 之前添加它):

var defaultCulture = new CultureInfo("tr-TR");
app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture(defaultCulture),
    SupportedCultures = new List<CultureInfo> { defaultCulture },
    SupportedUICultures = new List<CultureInfo> { defaultCulture }
});

调用.ToShortDateString()时,上面会以dd.MM.yyyy格式正确显示日期。但是,当发布日期时,它不会正确绑定/解析。

要在 POST 时正确解析日期格式,您需要设置 JSON 序列化程序的文化。我们可以在AddJsonOptions() 中设置 JSON 序列化器的文化。

将此添加到ConfigureServices 方法中,它应该可以解决问题。

services.AddMvc()
        .AddJsonOptions(options =>
        {
            options.SerializerSettings.Culture = new CultureInfo("tr-TR"); 
        });

【讨论】:

  • 非常感谢@Haldo。你说的我都做了。当我通过 .ToShortDateString() 测试时,它是 'dd.MM.yyyy' 格式。工作完美。但是,当我通过邮递员发送 POST 请求时,它又是 'MM.dd.yyyy' @Haldo
  • 您是否同时添加了app.UseRequestLocalization().AddJsonOptions() 格式为dd.MM.yyyy?这对我行得通。不知道还有什么建议。
  • 确保AddJsonOptions() 中的日期格式完全正确 dd.MM.yyyy。如果是dd-MM-yyyy,则会失败。
  • @HasanOzdemir 如果您能以yyyy.MM.dd(或ISO8601)格式发送日期,这将是最不模糊的格式,并且可能会解决问题。
  • @HasanOzdemir 我已经更新了我的答案。尝试将options.SerializerSettings.Culture = new CultureInfo("TR-tr"); 添加到AddJsonOptions
【解决方案2】:

试试这个 JsonConvert 属性来自定义日期

public class MyDateTimeConverter : IsoDateTimeConverter
{
    public MyDateTimeConverter()
    {
        base.DateTimeFormat = "dd-MM-yyyy";
    }
}

并将您的财产的属性用作

public class MyClass
{
    [JsonConverter(typeof(MyDateTimeConverter))]
    public DateTime MyDate { get; set; }
}

这会自动将正文转换为预期的格式。

如果您希望所有日期时间属性都采用这种格式,请将此全局设置添加到您的 startup.cs

services.AddMvc()  
   .AddJsonOptions(options =>  
   {  
     options.SerializerSettings.DateFormatString= "dd-MM-yyyy";  
   });  

但您必须确保为该属性提供的所有值都应采用提供的格式。希望这会有所帮助:)

【讨论】:

  • 谢谢。我可以通过更改我的本地化@Farshan 来做到吗?
  • @HasanOzdemir 我想它会起作用的。如果您在启动时的配置方法中使用 app.UseRequestLocalization("tr-TR"); 和支持的文化。
  • 再次感谢@Farshan。当我通过 .ToShortDateString() 测试时,它是 'dd.MM.yyyy' 格式。工作完美。但是,当我通过邮递员发送 POST 请求时,它是 'MM.dd.yyyy'
  • options.SerializerSettings.Culture = new CultureInfo("tr-TR"); 从 Haldo 的回答中解决了我的问题。感谢您的帮助@Farshan。
猜你喜欢
  • 2017-01-05
  • 2020-11-17
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多