Angularjs $ ресурс множественный POST

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, откуда я звоню:

<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? Также вы можете переименовать функцию PostAddToWatchList в PostAddToWatchList и попробовать.
  • 0
    Базовый маршрут: [RoutePrefix («api / Ads»)]
Теги:
asp.net-web-api
angular-resource

1 ответ

0
Лучший ответ

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

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

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

1 - Отправить adId через URI... api/ads/addtowatchlist? AdId = 123

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

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


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

=123

Ещё вопросы

Сообщество Overcoder
Наверх
Меню