为什么在这两种情况下模型验证的行为会有所不同?

时间:2020-10-26 08:55:54

标签: c# validation model asp.net-core-3.1

我继承了一些看起来有点奇怪的多态反序列化实现的代码。模型如下。

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." ] } } ,则模型验证成功。

为什么模型验证在第一个示例中失败而在第二个示例中成功?

0 个答案:

没有答案