我继承了一些看起来有点奇怪的多态反序列化实现的代码。模型如下。
navigation
这是JsonConverter
实现的简化版本。
React Navigation v5.x
在ASP.NET Core 3.1中,使用以下控制器:
[JsonConverter(typeof(ModelConverter))]
public abstract class AbstractModel
{
[Required]
public string ModelType { get; set; }
}
public class BaseModel : AbstractModel
{
// Some common properties
}
public sealed class BarModel : BaseModel
{
[Required]
public string RequiredProperty { get; set; }
}
如果我将public sealed class ModelConverter : JsonConverter<AbstractModel>
{
public override AbstractModel Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options)
{
using var doc = JsonDocument.ParseValue(ref reader);
var model = JsonSerializer.Deserialize<BaseModel>(doc.RootElement.GetRawText(), options);
return model.ModelType == "Bar"
? JsonSerializer.Deserialize<BarModel>(doc.RootElement.GetRawText(), options)
: model;
}
public override void Write(Utf8JsonWriter writer, AbstractModel value, JsonSerializerOptions options)
{
}
}
发布到[ApiController]
[Route("[controller]")]
public sealed class DoSomethingController : ControllerBase
{
[HttpPost]
public IActionResult PostSomething(AbstractModel model)
{
// Do something
return Ok();
}
[HttpPost("enumerable")]
public IActionResult PostSomething(IEnumerable<AbstractModel> model)
{
// Do something
return Ok();
}
}
,则模型验证失败,并且收到了预期的ProblemDetails
响应,如下所示。
{"ModelType": "Bar"}
但是,如果我将https://thehost/dosomething
发布到{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "{id}",
"errors": {
"RequiredProperty": [
"The RequiredProperty field is required."
]
}
}
,则模型验证成功。
为什么模型验证在第一个示例中失败而在第二个示例中成功?