如何在表单数据/[FromForm]中发送可为空的日期时间

Ale*_*ett 4 c# asp.net-web-api asp.net-core

我正在尝试向我的控制器发出 HTTP 请求并发回可为空的 DateTime。当填充字段时,此请求成功,当字段 (CloseDate) 为 null 时,我收到一个 HTTP 响应,指出 null 无效(对于 Close Date)。

在我的控制器中,我有一个如下所示的 post 方法:

    [HttpPost]
    [Authorize]
    [Route("properties/{propertyId}")]
    public async Task<IActionResult> BasicPropertyUpdate([FromForm] PropertyViewModel request)
    {

    }
Run Code Online (Sandbox Code Playgroud)

由于我收到 HTTP 400 响应,因此我不会遇到任何断点。

在我的 ViewModel 中,我有一个如下所示的合同:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Threading.Tasks;

    namespace ViewModels
    {
        public class PropertyViewModel
        {
            //other stuff
            public DateTime? CloseDate { get; set; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

原始 HTTP 响应(由 Fiddler 捕获)如下所示:

    HTTP/1.1 400 Bad Request
    Date: Tue, 10 Dec 2019 22:07:01 GMT
    Content-Type: application/json; charset=utf-8
    Server: Kestrel
    Vary: Origin
    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Origin: http://localhost:3000
    Access-Control-Expose-Headers: TotalCount
    Request-Context: appId=cid-v1:712f8d3d-6af6-44c6-a573-2b9adda915c7
    Content-Length: 62

    {"closeDate":["The value 'null' is not valid for CloseDate."]}
Run Code Online (Sandbox Code Playgroud)

我的 HTTP 请求中的表单数据(由 Fiddler 捕获)如下所示:

    -----------------------------32591187621655
    Content-Disposition: form-data; name="closeDate"

    null
Run Code Online (Sandbox Code Playgroud)

是否存在某种固有的限制来[FromForm]阻止发送可为空的日期时间字段?如果是这样,是否有一些推荐的替代方案可以完成工作?

mad*_*ion 5

" null" 是 JSON 文字,但 JSON 反序列化器不用于读取表单数据。它以 4 个字符的字符串形式发布。

模型绑定器会将空字符串绑定到可null为空的值类型,例如DateTime?。如果您将数据 POST 为application/x-www-form-urlencoded,则可以省略名称/值对或指定空字符串(即closeDate=)。

该表单数据似乎被编码为mime/multipart但同样的原理成立。零长度 mime 部分是一个空字符串,模型绑定器可以将其解释为null.