Невозможно передать массив целых чисел в webpi asp.net из приложения angular 7 - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь передать массив целочисленных значений в конечную точку веб-сервера с помощью моего углового 7-го приложения getDocumentUploadDetailsByIds. По какой-то причине конечная точка получает нулевое значение. Я пробовал несколько способов, но параметр конечной точки является нулевым. Может кто-нибудь сказать мне, где я иду не так

Компонент

  export interface IDocumentIds {
    ids: number[];
    }

          documentIds: IDocumentIds = <IDocumentIds>{};


          this.documentUploadService.createDocumentUpload(this.documents)
                    .then((result) => {
                        if (result) {
                            this.documentIds.ids = Object.keys(result).map(k => result[k]);
                            console.log(this.documentIds);
                            this.getDocumentUploadDetailsByIds(this.documentIds);
                            this.setGridOptions();
                            this.setColumns();
                            this.notify.success('Documents uploaded Successfully');
                        }
                    }).catch(err => {
                        this.notify.error('An Error Has Occured While uploading the documents');
                    });

 public getDocumentUploadDetailsByIds(documentIds) {
        if (this.ManagerStrategyId != null) {
            this.Loading = true;

            this.initGrid();
            this.documentUploadService.getDocumentUploadDetailsByIds(documentIds)
            .then((data) => {
                if (data) {
                    this.DocumentUploadDetails = data;
                    this.Loading = false;
                    this.notify.success('Documents uploaded Successfully');
                }
            }).catch(err => {
                this.notify.error('An Error Has Occured While uploading the documents');
            });
        }
    }

Услуги

     getDocumentUploadDetailsByIds(documentIds: IDocumentIds) {
                    return this.mgr360CommonService.httpGetByKey('/api/documentupload/detailsByIds' ,  documentIds);
                  }      

const httpPostOptions = {

    headers:
        new HttpHeaders(
            {
                'Content-Type': 'application/json; charset=utf-8',
            }),

    withCredentials: true,
};

        httpGetByKey(url: string, key: any) {

            return this.httpClient.get(this.webApiLocation + url + '/' + key, httpPostOptions)
                .pipe(map((response: Response) => {
                    return response;
                }))
                .toPromise()
                .catch((error: any) => {
                    this.onError(error);
                    return Promise.reject(error);
                });
        }

веб-интерфейс asp.net модель

  public class DocumentIdViewModel
    {
       public int[] ids;
    }

Конечная точка

 [HttpGet]
            [Route("api/documentupload/detailsByIds/{id}")]
            public IHttpActionResult DetailsByIds(DocumentIdViewModel documentIds)
            {
                var viewModel = GetDocumentUploadDetailsByIds(documentIds);
                return Ok(viewModel);
            }

Я также пытался установить параметр в массив int веб-метода

С угловой

this.getDocumentUploadDetailsByIds(this.documentIds.ids);

На сервере

 public IHttpActionResult DetailsByIds(int[] documentIds)
        {
            var viewModel = GetDocumentUploadDetailsByIds(documentIds);
            return Ok(viewModel);
        }

1 Ответ

0 голосов
/ 08 июля 2019

Если вы передаете ваш ids в теле, то добавьте [FromBody]:

[HttpPost]
public IHttpActionResult DetailsByIds([FromBody] int[] documentIds)
{
}

В противном случае, если вы отправите свои идентификаторы в URI:

[HttpPost]
public IHttpActionResult DetailsByIds([FromUri] int[] documentIds)
{
}

UPDATE: Чтобы получить перечисляемые параметры, необходимо создать следующую строку запроса:

localhost:56888/api/documentupload/DetailsByIds?
    detailsByIds=123&detailsByIds124&detailsByIds125 

На MSDN есть отличная статья о параметрах Привязка параметров в ASP.NET Web API

Вы можете использовать HttpParams класс для создания параметров. Поскольку ваше имя параметра совпадает, вы можете создать цикл. Это способ передачи URL-аргументов в HTTP-запрос:

import { HttpParams, HttpClient } from '@angular/common/http';

constructor(private http: HttpClient) { }

let params = new HttpParams();
params = params.append('var1', val1);
params = params.append('var2', val2);

this.http.get(StaticSettings.BASE_URL, {params: params}).subscribe(...);

Угловые документы о передаче параметров в запрос HTTP.

ОБНОВЛЕНИЕ 1:

Позвольте мне показать пример, как можно добавить параметры:

const array = [1, 2, 3, 4, 5];
let params = new HttpParams();
array.forEach(id => {
  params.append('detailsByIds', id);
});
...