Отправка ReactJs FormData с вложенными файлами модели в. net core 2.2 web api - PullRequest
0 голосов
/ 01 мая 2020

Я сталкиваюсь с этой проблемой. У меня есть эта вложенная модель внутри моего файла js

                                    var request={
                                        idCliente:form.idCliente,
                                        appUserId:user.data.id,
                                        idFiliale:user.data.idFiliale,
                                        idSuggeritore:form.idSuggeritore,
                                        contrattoLuceRequest:{
                                            numeroContratto:form.contratti[0].numeroContratto,
                                            idTipoContratto:form.contratti[0].idTipoContratto,
                                            idTipoOperazione:form.contratti[0].idTipoOperazione,
                                            idStatoContratto:form.contratti[0].idStatoContratto,
                                            note:form.contratti[0].note,
                                            numeroPod:form.contratti[0].contrattoLuce.numeroPod,
                                            allegati:form.contratti[0].allegatiContratto
                                        },
                                        formFiles:form.contratti[0].allegatiContratto
                                    }

свойства "allegati" объекта "contrattoLuceRequest" и "formFiles" объекта "запрос", представляют собой набор файлов, загруженных с компонентом Материал Ui Dropzone. Я должен отправить эту модель на мой net core 2.2 web api backend. Это сервис, который я использую для создания своего объекта formData. В этом тесте я игнорирую другие свойства ... Я фокусирую свой тест только на свойствах "formFiles" и "allegati".

let f = new FormData();
            for (var key2 in interazione.contrattoLuceRequest.allegati) {
                f.append("formFiles", interazione.contrattoLuceRequest.allegati[key2]);
            }
            for (var key3 in interazione.contrattoLuceRequest.allegati) {
                f.append("interazione.contrattoLuceRequest.allegati", 
                interazione.contrattoLuceRequest.allegati[key3]);
            }

Я отправляю все на сервер с топором ios

axios.post('/Interazioni',f,{
                    headers:{
                        'Content-Type':'multipart/form-data'
                    }
                }).then(response => {
                    resolve(response);
                }).catch(err=>{
                    return reject(err);
                })

И это. net core 2.2 web api

        [HttpPost]
        public async Task<IActionResult> AddInterazione([FromForm] InterazioneRequest interazioneRequest)
        {
            try
            {
                if (interazioneRequest == null)
                    return BadRequest();
                await this.interazioniService.AddInterazione(interazioneRequest);
                return Ok();
            }
            catch (ArgumentException ex)
            {
                return StatusCode(409, ex.Message);
            }
            catch (Exception ex)
            {
                return StatusCode(500, ex.Message);
            }
        }

Это модель сервера "InterazioneRequest"

public class InterazioneRequest
    {
        public int? Id { get; set; }
        public int IdCliente { get; set; }
        public int AppUserId { get; set; }
        public int IdFiliale { get; set; }
        public int? IdSuggeritore { get; set; }
        public ContrattoLuceRequest ContrattoLuceRequest { get; set; }
        public ContrattoGasRequest ContrattoGasRequest { get; set; }
        public ContrattoDualRequest ContrattoDualRequest { get; set; }
        public ContrattoMultiEleRequest ContrattoMultiEleRequest { get; set; }
        public ContrattoMultiGasRequest ContrattoMultiGasRequest { get; set; }
        public IFormFileCollection formFiles { get; set; }
    }

И это " ContrattoLuceRequest », которая используется для нашего теста

public class ContrattoLuceRequest
    {
        public int? Id { get; set; }
        public string NumeroContratto { get; set; }
        public string NumeroPod { get; set; }
        public int IdStatoContratto { get; set; }
        public int IdTipoContratto { get; set; }
        public int IdTipoOperazione { get; set; }
        public string Note { get; set; }
        public IFormFileCollection Allegati { get; set; }       
    }

А теперь проблема. Из внешнего интерфейса я отправляю все свои данные на сервер, но только «formFiles» правильно ограничены ... вложенное свойство «Allegati» объекта «ContrattoLuceRequest» всегда равно нулю. Это ошибка, или я игнорирую что-то важное? Я также прикрепляю сюда скриншот запроса, отправленного на сервер, * Chrome Dev Tools. Большое вам спасибо enter image description here

1 Ответ

0 голосов
/ 01 мая 2020

Простите, ребята. Проблема в том, что эта часть кода неправильная

    for (var key3 in interazione.contrattoLuceRequest.allegati) {
        f.append("interazione.contrattoLuceRequest.allegati", 
        interazione.contrattoLuceRequest.allegati[key3]);
    }

Правильный способ - удалить уровень «взаимодействия», потому что моя модель на основном уровне - «contrattoLuceRequest», поэтому правильный код -

for (var key3 in interazione.contrattoLuceRequest.allegati) {
    f.append("contrattoLuceRequest.allegati", 
    interazione.contrattoLuceRequest.allegati[key3]);
}

Сейчас работает. К сожалению

...