вот мой код:
Классы :
[Serializable]
public abstract class ChallengeDetailsDto : ChallengeDto
{
[JsonConverter(typeof(PagesConverter))]
public PageDto[] Pages { get; set; } = new PageDto[] { };
}
[Serializable]
public class CaseDto : ChallengeDto
{
public CaseDto()
{
Discriminator = CaseDtoDiscriminator;
}
}
Контроллер :
[HttpPost]
public async Task<IActionResult> CreateAsync([FromForm]CaseDetailsDto dto)
{
}
Пользовательский конвертер
internal class ChallengeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
if (objectType == typeof(ChallengeDto))
{
return true;
}
return false;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
ChallengeDto challengeDto = null;
var jsonChallange = JObject.Load(reader);
var discriminator = jsonChallange.Properties().First(p => p.Name == "discriminator").Value.ToString();
if (discriminator == ChallengeDto.CaseDtoDiscriminator)
{
challengeDto = (CaseDto)JsonConvert.DeserializeObject(jsonChallange.ToString(), typeof(CaseDto));
}
/*...*/
return challengeDto;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var challenge = value as ChallengeDto;
if (challenge.Discriminator == ChallengeDto.CaseDtoDiscriminator)
{
serializer.Serialize(writer, (CaseDto)challenge);
}
/*...*/
}
}
Ошибка :
Не удалось создать экземпляр типа 'Controllers.Challenges.Dtos.PageDto.Сложные типы, связанные с моделью, не должны быть абстрактными или значениями и должны иметь конструктор без параметров.
Если я использую [FromBody], все работает нормально.Из того, что я могу понять, при использовании [FromForm] привязка не использует Json.
Как лучше всего связать значения формы со свойством в этом случае?