0

У меня есть несколько Web Api Post methods как:

[HttpPost] 
    public async Task<IHttpActionResult> Post([FromBody] AdModel adModel) 
    { 
     //Post 
    } 

    [HttpPost] 
    [Route("AddToWatchList")] 
    public async Task<IHttpActionResult> AddToWatchList(int adId) 
    { 
     // Post to database 
    } 

Вот мой AngularJs сервер:

app.factory('adService', ['$resource', 'ngAuthSettings', function ($resource, ngAuthSettings) { 

     var serviceBase = ngAuthSettings.apiServiceBaseUri; 

return $resource(serviceBase + 'api/Ads/', {}, { 
      addToWatchList: { 
      method: 'POST', 
      url: serviceBase + 'api/Ads/addToWatchList' 
      } 
     } 
    }); 
}]); 

AngularJs Контроллер:

app.controller('listCategoryAdsController', 
    ['ngAuthSettings', '$scope', 'adService', '$routeParams', '$location', 
    function (ngAuthSettings, $scope, adService, $routeParams, $location) { 

    $scope.addToWatchlist = function (adId) { 
     adService.addToWatchList({ adId: adId }).$promise.then(
      function(result) { 
       var path = $location.path(); 
       $location.path(path).search('nw', 1); 
      }, 
      function (error) { 

     }); 
    }; 

Мой Html от где я называю meth спосо:

<div class="col-sm-3 text-right price-box" data-ng-repeat="ad in Ads"> 
    <h2 class="item-price"> 
     $ {{ad.price}} 
    </h2> 
    <i class="fa fa-certificate"> 
    </i> 
    <a ng-click="addToWatchlist(ad.adId)" class="btn btn-default btn-sm make-favorite" tooltip="Click to add to watch list" 
      tooltip-placement="left" 
      tooltip-trigger="mouseenter"> 
      <i class="fa fa-heart"></i> 
      <span>Watch list</span> 
    </a> 
</div> 

Моя проблема Post([FromBody] AdModel adModel) вызывается совершенно. Но когда я называю AddToWatchList(int adId) я получаю:

POST http://localhost:8081/api/Ads/addToWatchList 404 (Не найдено)

+0

Каков базовый маршрут, установленный на сервере webapi-контроллера? Также вы можете переименовать функцию webapi в 'PostAddToWatchList' и попробовать. – Chandermani

+0

Базовый маршрут [RoutePrefix ("api/Ads")] –

ответ

0

Вы отправляете простой тип (INT) в AddToWatchList(), поэтому Web API ищет в URI для параметра adId.

Если параметр является «простой» тип, Web API пытается получить значение из URI. Простые типы включают в себя примитивные типы .NET (int, bool, double и т. Д.), Плюс TimeSpan, DateTime, Guid, decimal, и string, плюс любой тип с конвертером типов, который может конвертировать из строку , (Подробнее о преобразователях типов позже.) Для сложных типов, Web API пытается прочитать значение из тела сообщения, используя форматный формат . More on this..

У вас есть несколько вариантов:

1 - Отправить Адид через URI ... апи/объявления/addtowatchlist Адид = 123

$resource(serviceBase + 'api/Ads/addToWatchList', { }, { 
    addToWatchList: { method:'POST', params:{ adId:adId } } 
}); 

2? - Очевидно, использовать сложный объект, как вы делаете в первом методе. Хотя он чувствует себя глупо, имея класс с единственным свойством int ... вот почему мы с вами не любим этот подход. Но если у вас уже есть класс Ad, нет ничего плохого в повторном использовании его.


3 - Попробуйте this solution, который требует, в котором вы бы добавить [FromBody] к вашему параметру INT. И отправьте adId без идентификатора

=123 

 Смежные вопросы

  • Нет связанных вопросов^_^