我正在构建一个控制器,该控制器应该通过请求的主体接收
Workflow
类型,但它不尊重 JsonIgore
属性并引发模型验证错误,提示:
“名称字段为必填项。”
当我研究 Swagger 建议的身体时,这就是人们所期望的:
{
"schedule": "string",
}
但即使我在请求中明确指定
name
,它仍然会抛出相同的异常。为什么?
这是我的测试设置:
public class Workflow
{
[JsonIgnore]
public string Name { get; set; }
public string Schedule { get; set; }
// ...
}
[ApiController]
[Route("api/[controller]")]
public class WorkflowsController : ControllerBase
{
[HttpPut("{workflowName}")]
public async Task<int> CreateWorkflow(string workflowName, [FromBody] Workflow workflow)
{
return await Task.FromResult(0);
}
}
我是否必须为主体创建另一个类,或者有没有办法修复这种奇怪的行为?
JsonIgnore
将忽略该属性进行序列化,这意味着它不会设置它。由于您使用的是可为 null 的引用类型,因此属性 Name
预计具有一个值,并且模型验证将考虑到这一点。
您可以给它一个默认值
public string Name { get; set; } = string.Empty;
或者使其可为空
public string? Name { get; set; }
我在使用计算属性时遇到了这个问题。该属性不可为空,并且被计算为基于另一个(不可为空)可设置属性。
当省略可设置属性时,我会在两个属性上收到模型绑定错误,这会误导客户端。
在我的例子中解决这个问题的唯一方法是使用空合并,尽管事实上没有一个值可以为空:
class MyModel {
public string Name { get; set; }
public string FirstName => Name ?? ""; // This is the hack
}
如果没有
??
hack,当请求中省略 Name
时,您会收到错误消息,指出缺少 Name
和 FirstName
。