如何在.Net Core Api Server中的FromForm情况下使用自定义绑定来绑定属性

时间:2018-10-11 15:30:32

标签: asp.net-core .net-core

这是我的代码:

课程

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

在这种情况下,将表单值绑定到属性的最佳方法是什么?

0 个答案:

没有答案