【发布时间】:2022-05-19 18:46:02
【问题描述】:
我使用 C# 9.0 record 类型作为 .NET 5.0 Web API 项目的绑定模型。某些属性是必需的。
我正在使用record 位置语法,但收到错误。
public record Mail(
System.Guid? Id,
[property: Required]
string From,
[property: Required]
string[] Tos,
[property: Required]
string Subject,
string[]? Ccs,
string[]? Bccs,
[property: Required]
Content[] Contents,
Attachment[]? Attachments
);
然后将其公开为我的 Index 操作的绑定模型:
public async Task<ActionResult> Index(Service.Models.Mail mailRequest)
{
…
}
但是,每当我尝试发出请求时,都会收到以下错误:
记录类型“Service.Models.Mail”具有在属性“内容”上定义的验证元数据,将被忽略。 “内容”是记录主构造函数中的参数,验证元数据必须与构造函数参数相关联。
我尝试删除 Contents 属性上的属性,但它随后对下一个(先前的)属性失败。我尝试使用[param: …] 而不是[property: …],以及混合它们,但不断收到相同类型的错误。
我浏览了网络,并没有发现任何针对 C# 9 记录以不同方式处理注释的建议。我尽了最大努力,但除了将我的记录转换为 POCO 之外,我没有任何想法。
【问题讨论】:
-
这是一个有趣的错误。我本来希望指定
[param: …]属性目标来覆盖它。出于好奇,您是否尝试过将这些作为显式属性分配到您的记录中,而不是使用位置构造函数语法作为隐式属性?我不确定它是否会有所作为,但鉴于该错误突出了构造函数的问题,了解它如何影响错误可能很有用。我还假设您在没有任何属性目标的情况下尝试过此操作(即完全删除property:)? -
@JeremyCaney 使用用属性装饰的隐式属性对我有用。
-
嗯!这很好奇。这似乎是如何使用记录处理注释的一个错误,可能是因为构造函数参数兼作属性定义。很高兴听到您解决了问题。
-
@serge_portima 在记录中,默认情况下需要 all 位置属性。它们成为构造函数的一部分,因此 all 都需要有一个值。将
Required放在属性上没有意义,因为一旦设置就无法更改属性的值。如果您希望属性为非空,则必须对 构造函数参数本身 执行验证 -
@PanagiotisKanavos Swashbuckle 没有按要求识别它们,这是我的目标之一。
标签: asp.net-core-webapi asp.net5 c#-9.0 c#-record-type