Вызов действия контроллера WebAPI с двумя параметрами - PullRequest
0 голосов
/ 14 января 2019

У меня есть действие контроллера WebAPI, которое имеет 2 параметра. Как я могу назвать это действие?

С одним параметром мой код работает хорошо. Как мне вызвать WebAPI, который имеет 2 параметра? Я пробовал пару способов, и это не работает. У меня есть действие контроллера WebAPI, которое имеет 2 параметра. Как я могу назвать это действие?

С одним параметром мой код работает хорошо. Как мне вызвать WebAPI, который имеет 2 параметра? Я пробовал пару способов, и это не работает.

Заранее спасибо

//With a single parameter it works good:
[Route("api/Controller/GetAllVendors")]
[HttpPost]
public IEnumerable<Vendor> GetAllVendors(LoginParameters loginParam)
{
}

function LoadVendorLkup() {
    alert("InVendorCall");
    var loginPar = {
    UserName: 'user1',
    CompanyID: 'company1',
    ProgramID: ''
}
$.ajax({
    type: 'POST',
    url: '/api/Controller/GetAllVendors',
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(loginPar), 

/////////////////////////////////////////////////////////////////////////
//With 2 parameters , it does not work:

[Route("api/Controller/GetVendorsForSelectedHouseholdID")]
[HttpPost]
public IEnumerable<Vendor> GetVendorsForSelectedHouseholdID(LoginParameters loginParam, string hHoldID)
{
}

function LoadVendorLkupForSelectedHousehold() {
    var hHoldtext = $('#txtHHold').val();
    var loginPar = {
    UserName: 'user1',
    CompanyID: 'company1',
    ProgramID: ''
}
 $.ajax({
    type: 'POST',
    url: '/api/controller/GetVendorsForSelectedHouseholdID',
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(loginPar), 'hHoldID': hHoldtext,
//////////////////////////////////////////////////////

//I also tried the following:
[Route("api/controller/GetVendorsForSelectedHouseholdID/{hHoldID:String}")]
[HttpPost]
public IEnumerable<Vendor> GetVendorsForSelectedHouseholdID([FromBody()]LoginParameters loginParam,[FromUri()]string hHoldID)
{
}

function LoadVendorLkupForSelectedHousehold() {
    alert("InVendorCall2");
    var hHoldtext = $('#txtHHold').val();
    alert("Household:" + hHoldtext);
    var loginPar = {
    UserName: 'user1',
    CompanyID: 'company1',
    ProgramID: ''
}
$.ajax({
    type: 'POST',
    url: '/api/controller/GetVendorsForSelectedHouseholdID?hHoldID='+ hHoldtext,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(loginPar), 

1 Ответ

0 голосов
/ 14 января 2019

Множественные атрибуты [FromBody] для параметров POST не будут работать, как указано в документации здесь .

// Caution: Will not work!    
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }

Причина этого правила в том, что тело запроса может быть сохранено в небуферизованный поток, который может быть прочитан только один раз.

В этом блоге указано, что для этого есть 3 простых метода:

  1. Использовать как POST, так и GET (один параметр из поста, другой параметр из строки запроса)

  2. Создание 1 модели, которая инкапсулирует все значения в одной модели

  3. Используйте JSON.Stringify для передачи одного JSON в API, а затем используйте JObject в качестве параметра в веб-API. Затем разберите JSON в веб-API.

Существует еще одна опция - вы также можете создать пользовательское связующее с помощью IModelBinder, как указано в документации: https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

...