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; }
}
在 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; }
}