Angularjs $资源多个POST

时间:2015-09-26 10:13:06

标签: javascript .net angularjs asp.net-web-api angular-resource

我有多个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(未找到)

1 个答案:

答案 0 :(得分:0)

您正在向AddToWatchList()发送一个简单类型(int),因此Web API正在查找adId参数的URI。

  

如果参数是“simple”类型,则Web API会尝试获取该值   来自URI 。简单类型包括.NET基元类型( int ,   bool,double等等,加上TimeSpan,DateTime,Guid,decimal,   和字符串,以及具有可转换的类型转换器的任何类型   一个字符串。 (稍后将详细介绍类型转换器。)对于复杂类型,Web   API尝试使用媒体类型从邮件正文中读取值   格式化。   More on this..

您有几个选择:

1 - 通过URI发送adId ... api / ads / addtowatchlist?adId = 123

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

2 - 显然使用第一种方法中的复杂对象。虽然有一个具有单个int属性的类感觉很愚蠢......这就是为什么你和我不喜欢这种方法。但是如果你已经有了一个Ad类,那么重用它并没有错。

3 - 尝试this solution,您需要在其中添加[FromBody]到您的int参数。并发送没有标识符的adId

=123