ASP .NET Core - 如何判断数据协定 属性 是否未设置或设置为 null

ASP .NET Core - How to tell if data contract property was not set or set to null

在 ASP .NET Core 中,为 PATCH 端点提供控制器方法,如下所示:

[HttpPatch]
[Route("{entity_id}")]
public async Task<IActionResult> UpdateEntity(
    [FromRoute(Name = "entity_id")]int entity_id,
    [FromBody(Name = "")]EntityUpdate entityUpdate,
    CancellationToken cancellationToken
)
{
    await UpdateEntity(
        entity_id,
        entityUpdate,
        cancellationToken
    );
    return Ok();
}

以及 EntityUpdate 的以下定义:

[DataContract(Name = "entity_update")]
public class EntityUpdate 
{
    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "description")]
    public string Description { get; set; }
}

有没有办法告诉 EntityUpdate 中给定的 属性 是否被客户端明确设置为 null 或简单地省略了?

我希望 ModelState 会向您展示它找到的属性,但是这似乎只在出现验证错误时填充任何有用的东西。

一种可以说是粗略的方法是检查每个 属性 名称的原始请求正文。例如,如果正文是 JSON,这将查找 "name" 以查看是否设置了 Name 属性:

string body;
using (var reader = new StreamReader(Request.Body)) {
    body = await reader.ReadToEndAsync();
}

if (body.Contains($"\"{nameof(EntityUpdate.Name)}\"", StringComparison.CurrentCultureIgnoreCase)) {
    //name was set
}

我放弃了 auto属性 并包含了 Changed 属性.

[DataContract(Name = "entity_update")]
public class EntityUpdate 
{
    private string _name;
    private bool _nameChanged;
    [DataMember(Name = "name")]
    public string Name { get => _name; set { _name = value; _nameChanged = true; } }

    [DataMember(Name = "description")]
    public string Description { get; set; }
}