2015-02-14 2 views
3

У меня есть следующий контроллер в моем ASP.NET WebAPI Применение:отправить несколько объектов WebAPI с angularjs

[Route("api/PutItem/")] 
    [HttpPut] 
    public IHttpActionResult PutItem(Guid id, Item item) 
    { 
     if (!ModelState.IsValid) 
    } 

И я следующий в моем "Вещи" AngularJs службы

var doEditItem = function(item){ 
      var deferred = $q.defer(); 

      console.log('item', item); 
      var config = { 
       headers: { 'Authorization': "Bearer " + $rootScope.token } 
       //,params: {id:item.ItemId} 
      } 
      $http.put(sitesettings.url() + "api/PutItem/", item, config) 
        .success(function(data){ 

         deferred.resolve(data); 
        }).... 

I в конечном итоге получили это сообщение:

не было найдено ни одного HTTP ресурс, соответствующий запрос URI 'http://localhost:63289/api/PutItem/ ", MessageDetail:„ Никаких действий не было найдено на контроллере „Items“, что соответствует запросу“}

Я внес изменения в параметры, чтобы добавить этот пункт так:

jItem = {id:item.ItemId, item:item} 

, а затем я попытался прохождения jItem в методу пут, как это:

$http.put(sitesettings.url() + "api/PutItem/", jItem, config) 

Мое приложение поднимает Guid, но не новый товар. Если я удалю Guid и отправлю элемент, мое приложение получит новый элемент.

Я хотел бы знать, как мне нужно изменить свое приложение, чтобы я мог отправить Guid, и приложение также подбирает новый Item.

Я использовал Angular.toJson (item, false); но это не похоже на то, как мое приложение ASP.NET получает информацию.

Большое спасибо

ответ

6

Вы не можете отправить сложный тип вместе с таким примитивным типом, как действие WebAPI, вы можете либо отправить несколько примитивных типов (Guid's, int, strings и т. Д.), Либо один сложный тип (Item). Если вы хотите отправить обоих, Обходной использовать JObject:

[HttpPut] 
public void PutItem(JObject data) 
{ 
    Item item = data["item"].ToObject<Item>(); 
    Guid id = data["id"].ToObject<Guid>(); 
} 

Направлено как это от углового:

$http({ 
     url: "/api/PutItem", 
     method: "PUT", 
     data: {id: SOMEGUID, item: { ......} } 
}); 
+0

Perfect .... Спасибо – James

0

в Вашем коде:

[Route("api/PutItem/")] 
    [HttpPost] 
public IHttpActionResult PutItem(Guid id, Item item) 

Так вы отправить Помещенные или сообщение? Я думаю, что это проблема

+0

Привет, Гаррет, моя ошибка, потому что я играл с кодом, я забыл изменить один из методов. Но даже если они оба совпадают с постами или поставками, это не сработает. Я исправлю это сейчас. Спасибо – James

0

Вытащил из рабочего проекта

AngularJS:

var apiUrl = ngRoot + '/api/ControllerName'; //ControllerName should match APIControllerName 
$http.put(apiUrl + '/RoutValue/' + id, model); 

WebAPICконтроллер:

[HttpPut] 
[Route("api/APIControllerName/RoutValue/{id}")] 
public HttpResponseMessage Put(int id, Model model) 

или для списка моделей

public HttpResponseMessage Put(int id, List<Model> model) 
-1

@Pakk, ваши методы работы вызывают первого параметра «идентификатор» посылается как часть строки запроса, и только второй как часть тела запроса ,Это единственный способ, которым это работает, отправка нескольких из тела не будет работать.

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