send multiple objects to webapi with angularjs

匿名 (未验证) 提交于 2019-12-03 08:48:34

问题:

I have the following controller in my ASP.NET WebApi Application:

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

And I have the following in my "Items" AngularJs service

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 end up receiving this message:

No HTTP resource was found that matches the request URI 'http://localhost:63289/api/PutItem/'.", MessageDetail: "No action was found on the controller 'Items' that matches the request."}

I have made changes to the parameters to add the item like this:

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

and then I've tried passing jItem into to the put method like this:

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

My application picks up the Guid, but not the new Item. If I remove the Guid, and send the item, my Application picks up the new Item.

I would like to know how I need to change my application so that I can send a Guid and the application picks up the new Item too.

I have used Angular.toJson(item, false); but this doesn't seem to change how my ASP.NET application is receiving the information.

Many thanks

回答1:

You can not send a complex type along with a primitive type like that to an WebAPI action, you can either send multiple primitive types (Guid's, int's, strings etc.) or a single complex type (Item). If you want to send both, a work around is to use JObject:

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

Sent like this from angular:

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


回答2:

in Your code:

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

So You send Put or Post? I think that this is a problem



回答3:

Pulled from a working project

AngularJS:

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

WebAPIController:

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

or for list of models

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


回答4:

@Pakk, your methods work cause the first parameter "id" is being sent as part of the querystring, and only the second one as part of the request body. Thats the only way it works, sending multiple from the body won't work.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!