2015-09-26 110 views
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 OD:

<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(),因此网络API所期望的URI为adId参数。

如果该参数是“简单”类型,网页API尝试从URI获得的价值 。简单类型包括.NET基本类型(int, bool,double等),加上TimeSpan,DateTime,Guid,十进制, 和字符串,以及任何类型的转换器可以从 转换为字符串。 (稍后关于类型转换器的更多信息。)对于复杂类型,Web API尝试使用媒体类型 格式化程序从消息正文中读取值。 More on this..

您有几种选择:

1 - 发送ADID通过URI ... API /广告/ addtowatchlist的AdID = 123

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

2? - 显然使用一个复杂的对象,就像你在第一个方法中做的那样。虽然感觉愚蠢的拥有一个int类型的类...这就是为什么你我不喜欢这种方法。但是如果你已经有了一个Ad类,那么重用它就没什么问题。


3 - 尝试this solution这就需要在其中将增加[FromBody]你的int参数。并发送adid在没有标识符

=123