У меня несколько 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 (не найдено)
Вы отправляете простой тип (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
PostAddToWatchList
вPostAddToWatchList
и попробовать.