asp.net-core - 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
按预期工作。如何自动验证实现类型中定义的字段,使其与其他字段一样工作?
解决方案
代替:
var jObject = JObject.Load(reader);
和:
JToken jObject = JToken.ReadFrom(reader);
推荐阅读
- dialogflow-es - 在荷兰测试 Actions on Google Transaction API 时出现“抱歉,我无法在您所在地区收款”消息
- aurelia - 在转发器中使用 @computedFrom 数组
- r - 具有灵活函数参数的复杂 if else 函数的代码改进
- c# - .NET Framework 依赖树
- aframe - 有没有办法在 3d 模型中的特定网格上执行动画
- apache-kafka - Kafka:手动分配的消费者由于“GroupAuthorizationException”而无法提交或关闭
- linux-kernel - Linux 内核安全注意事项
- python - 如何让 VSCode 的自动完成功能和 PyCharm 一样强大?
- angular - 如何防止primeng下拉事件?
- ios - 实时数据库未返回预期数据