ASP NET CORE 5 - Pass master-detail object (with file) to controller

Solution 1:

It is a known issue on github. You need custom model binding for the list model.

You need post data like below: enter image description here

Then custom model binder like below:

public class MetadataValueModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (values.Length == 0)
            return Task.CompletedTask;
        var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };

        var deserialized = JsonSerializer.Deserialize(values.FirstValue, bindingContext.ModelType, options);

        bindingContext.Result = ModelBindingResult.Success(deserialized);
        return Task.CompletedTask;
    }
}

Add the model binder to the model class:

public class MasterDTO
{
    public string Comments { get; set; }
    public IFormFile File { get; set; }        
    public List<DetailDTO> Details { get; set; }

    public MasterDTO()
    {
        this.Details = new List<DetailDTO>();
    }
}

[ModelBinder(BinderType = typeof(MetadataValueModelBinder))]
public class DetailDTO
{
    public Int64 ElementId { get; set; }

    public double LowerLimit { get; set; }

    public double HigherLimit { get; set; }

    public string Status { get; set; }

    public string UserAuthorization { get; set; }

    public DateTime? AutorizationDate { get; set; }
}