ASP. NET Core: атрибуты проверки игнорируются в полях, определенных в дочерних типах. - PullRequest
1 голос
/ 10 февраля 2020

My ASP. NET Core 2.1 API предоставляет следующий входной DTO в конечной точке POST:

[Route("test")]
[ApiController]
public class TestController : ControllerBase
{
    [HttpPost("endpoint")]
    public async Task<IActionResult> Post([Required]MyDTO dto)
    {
        // Some code
    }
}
public class MyDTO
{
  [JsonProperty("foo")]
  [Required]
  public Foo Foo { get; set; }
}

Класс Foo определяется следующим образом:

[JsonConverter(typeof(FooConverter))]
public abstract class Foo
{
  [JsonProperty("foo_type")]
  [Required]
  public string FooType { get; set; }
}

Класс FooConverter может создавать правильную реализацию на основе поля foo_type:

public class FooConverter : JsonConverter<Foo>
{
    public override bool CanRead => true;
    public override bool CanWrite => false;

    public override Foo ReadJson(JsonReader reader, Type objectType, Foo existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);
        Foo target = this.CreateFoo(jObject);
        serializer.Populate(jObject.CreateReader(), target);

        return target;
    }

    public override void WriteJson(JsonWriter writer, Foo value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    private Foo CreateFoo(JObject jObject)
    {
        string fooType = jObject.Value<string>("foo_type");
        switch (fooType)
        {
            case "foo1":
                return new Foo1();
            case "foo2":
                return new Foo2();
            default:
                throw new JsonSerializationException($"Invalid 'foo_type' '{fooType}'");
        }
    }
}

Вот одна из реализаций абстрактного класса Foo:

public class Foo1 : Foo
{
  [JsonProperty("bar")]
  [Required]
  public string Bar { get; set; }
}

Моя проблема в том, что атрибут [Required] в Foo1.Bar игнорируется проверкой ASP. NET, даже если атрибут [Required] в Foo.FooType работает должным образом. Как я могу автоматически проверять поля, определенные в типах реализации, чтобы он работал так же, как и с другими полями?

1 Ответ

0 голосов
/ 19 февраля 2020

Заменить:

var jObject = JObject.Load(reader);

на:

JToken jObject = JToken.ReadFrom(reader);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...