首页 > 解决方案 > ASP.NET Core:在子类型中定义的字段上忽略验证属性

问题描述

我的 ASP.NET Core 2.1 API 在 POST 端点中公开了以下输入 DTO:

[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]属性 onFoo1.Bar被 ASP.NET 验证忽略,即使[Required]属性 onFoo.FooType按预期工作。如何自动验证实现类型中定义的字段,使其与其他字段一样工作?

标签: asp.net-coremodel-validation

解决方案


代替:

var jObject = JObject.Load(reader);

和:

JToken jObject = JToken.ReadFrom(reader);

推荐阅读