首页 > 解决方案 > 将值从 Angular 应用程序发布到 .Net Core WebAPI 时忽略时区

问题描述

我将以下 JSON 从我的Angular应用程序发布到.Net Core WebAPI

{CompanyBillingHireRateId: 4, CompanyId: 44, AccountId: null, EquipmentId: 128, EffectiveDate: Sun Dec 29 2019 00:00:00 GMT+0200 (South Africa Standard Time)}

如您所见, 的值EffectiveDate如下:EffectiveDate: Sun Dec 29 2019 00:00:00 GMT+0200 (South Africa Standard Time)

下面是我的 .Net Core 控制器方法:

[HttpPut("billing/hirerates/update")]
    public async Task<IActionResult> UpdateNewCompanyBillingHireRateAsync([FromBody] CompanyBillingHireRateViewModel model)
    {
        try
        {
            var success = await _companyFacade.UpdateCompanyBillingHireRates_Async(model).ConfigureAwait(false);
            if (success)
                return Created("", success);
            return StatusCode((int)HttpStatusCode.BadRequest);
        }
        catch (CustomException cEx)
        {
            await _customExceptionProcess.ProcessCustomException(cEx).ConfigureAwait(false);
            return StatusCode(cEx.StatusCode, new { Message = cEx.FriendlyMessage ?? "" });
        }
    }

在我的 .Net 应用程序中,EffectiveDate收到的是:{2019/12/28 22:00:00 +00:00}

在我的 .NetStartup.cs中,我试图将 API 配置为忽略时区,并按原样保留接收到的日期值,并转换为datetime.Net 中的对应值,但未能这样做。这是我的启动,cs配置:

services.AddControllers().AddNewtonsoftJson(setup =>
        {
            setup.SerializerSettings.ContractResolver = new DefaultContractResolver();
            setup.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            setup.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
            setup.SerializerSettings.DateParseHandling = Newtonsoft.Json.DateParseHandling.None;
            setup.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
        });

如何将 API 配置为忽略时区,并将 JSON 值读取为字符串,然后解析为从 Angular UI 接收到的相应日期?

标签: .netangularasp.net-core.net-coreasp.net-core-3.1

解决方案


这就是我为我的项目解决这个问题所做的:

由于 Angular 在浏览器中运行,并且您的浏览器使用local time,因此我更改了我的 API 以相应地处理此问题,如下所示:

services.AddControllers().AddNewtonsoftJson(setup =>
        {
            setup.SerializerSettings.ContractResolver = new DefaultContractResolver();
            setup.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            setup.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
        });

推荐阅读