Как передать две заполненные модели классов через «тело» Angular http.post в контроллер? - PullRequest
0 голосов
/ 18 июня 2019

Я получаю сообщение об ошибке «Последовательность не содержит элементов» при попытке обновить таблицу в SQL из Angular 7 до контроллера AspNet Core путем передачи двух параметров модели с использованием «http.post».

Я передаю данные из формы моделям классов без проблем, потому что я вижу данные полезной нагрузки в консоли браузера. Однако при попытке передать модели в качестве параметров в моей службе API в контроллер все параметры в модели являются нулевыми. У меня обычно нет проблем при прохождении одной модели через парм, но передача двух из них, чтобы добраться до моего контроллера с [FromBody], похоже, не хочет работать для меня.

Я пытался обернуть модели в фигурные скобки, чтобы пропустить их, но безрезультатно:

UpdateService(serviceAddress: ServiceAddressModel, contact: ContactModel) {
let reqHeader = new HttpHeaders();
let body = { svc: serviceAddress, cnt: contact };
reqHeader.append('Content-Type', 'application/json');
return this.http.post(this.baseurl + 'api/customermanagement/update-service-address-info', body, { headers: reqHeader });

Когда я просматриваю запрос / ответ в консоли браузера, я вижу данные внутри полезной нагрузки, поэтому я знаю, что данные готовы к передаче.

Мой контроллер настроен следующим образом:

       [Route("update-service-address-info")]
    public bool UpdateServiceAddressAccount([FromBody] ServiceAddressEntity svc_id, [FromBody] ContactEntity cnt_id)
    {
        return serviceAddressService.UpdateServiceAddressAccount(svc_id, cnt_id);
    }

Использование точек останова в этом вызове показывает нулевое значение для всех значений.

Если я смогу правильно передать параметры моему интерфейсу, у меня все получится. Я чувствую, что неправильно структурирую параметры в теле http.post.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Тело вашего запроса, { svc: serviceAddress, cnt: contact } получено в виде строки json, например, {"svc":{"serviceAddressProperty1":"value",...},"cnt":{"contactProperty1":"value",...}}.Параметры вашего метода действия связаны с помощью механизма привязки модели по умолчанию (если вы не предоставите свою собственную реализацию привязки модели).Механизм по умолчанию пытается создать экземпляры путем привязки с верхнего уровня объекта json, полученного с запросом.enter code here Проще говоря, предположим, что класс ServiceAddressModel определен следующим образом:

public class ServiceAddressModel
{
   public string Name { get; set; }
   public string Property2 { get; set; }
}

связыватель модели ищет свойства с именами "name" и "property2" на верхнем уровнеJSON Tree.Если они найдены, они привязываются к свойствам Name и Property2 созданного экземпляра.В вашем случае, оборачивание ваших моделей в класс, который может иметь свойства svc_id и cnt_id верхнего уровня, будет работать нормально.Как в следующем примере:

public class MyRequest
{
     public ServiceAddressModel svc_id { get; set; }
     public ContactEntity cnt_id { get; set; }
}

Затем вы можете объявить свое действие как

 [Route("update-service-address-info")]
public bool UpdateServiceAddressAccount([FromBody] MyRequest request)
{
    return serviceAddressService.UpdateServiceAddressAccount(request.svc_id, request.cnt_id);
}

Кожух змеи, верблюжий кожух должен быть разрешен по умолчанию (вам придется попробовать его, я не проверялэта часть).То есть, если вы объявите свои свойства как SvcId и CntId (если вы предпочитаете более естественные соглашения об именах C #), он сможет правильно связываться из JSON с "svc_id" или "cnt_id".

Другим вариантом будет реализация пользовательских связывателей моделей, но это может быть более длинный и более сложный маршрут.

Надеюсь, это поможет.

0 голосов
/ 18 июня 2019

Просто попробуйте передать значение вот так и увидите

let body = { svc_id : адрес службы, cnt_id : контакт};

...