FromBody 不会忽略 POST 上用 JsonIgnore 修饰的属性

问题描述 投票:0回答:2

我正在构建一个控制器,该控制器应该通过请求的主体接收

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

我是否必须为主体创建另一个类,或者有没有办法修复这种奇怪的行为?

c# rest asp.net-core model-binding .net-7.0
2个回答
3
投票

JsonIgnore
将忽略该属性进行序列化,这意味着它不会设置它。由于您使用的是可为 null 的引用类型,因此属性
Name
预计具有一个值,并且模型验证将考虑到这一点。

您可以给它一个默认值

public string Name { get; set; } = string.Empty;

或者使其可为空

public string? Name { get; set; }

0
投票

我在使用计算属性时遇到了这个问题。该属性不可为空,并且被计算为基于另一个(不可为空)可设置属性。

当省略可设置属性时,我会在两个属性上收到模型绑定错误,这会误导客户端。

在我的例子中解决这个问题的唯一方法是使用空合并,尽管事实上没有一个值可以为空:

class MyModel {
  public string Name { get; set; }

  public string FirstName => Name ?? ""; // This is the hack
}

如果没有

??
hack,当请求中省略
Name
时,您会收到错误消息,指出缺少
Name
FirstName

© www.soinside.com 2019 - 2024. All rights reserved.