Как связать свойство с помощью пользовательского связывания в ситуации FromForm в .Net Core Api Server - PullRequest
0 голосов
/ 11 октября 2018

вот мой код:

Классы :

[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.

Как лучше всего связать значения формы со свойством в этом случае?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...