Below is the code for a simple JsonModelBinder I created for an ASP.NET Core Mvc app. Is there a simple way to recursively validate the model, its properties and the properties of its properties and so on?
JsonModelBinder
public class JsonModelBinder : IModelBinder
{
    static readonly JsonSerializerSettings settings = new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore,
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    };
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        try
        {
            var json = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).Values;
            if (json.Count > 0)
            {
                var model = JsonConvert.DeserializeObject(json, bindingContext.ModelType, settings);
                // TODO: Validate complex model
                bindingContext.Result = ModelBindingResult.Success(model);
            }
            else
            {
                bindingContext.Result = ModelBindingResult.Success(null);
            }
        }
        catch (JsonException ex)
        {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex.Message);
            bindingContext.Result = ModelBindingResult.Failed();
        }
        return Task.CompletedTask;
    }
}
Example model
public class Foo {
    [Required]
    public string Name { get; set; }
    public List<Bar> Bars { get; set; }
    public Baz Baz { get; set; }
}
public class Bar {
    [Required]
    public string Name { get; set; }
}
public class Baz {
    [Required]
    public string Name { get; set; }
}
Controller action
public async Task<IActionResult> Edit(Guid id, [Required, ModelBinder(typeof(JsonModelBinder))] Foo foo) {
    if (ModelState.IsValid) {
        // Do stuff
    }
    else {
        return View(foo);
    }
}
