使用 angularjs 将多个对象发送到 webapi

send multiple objects to webapi with angularjs

我的 ASP.NET WebApi 应用程序中有以下控制器:

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

我的 "Items" 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);
                    })....

我最终收到了这条消息:

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."}

我已更改参数以添加如下项目:

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

然后我尝试将 jItem 传递给 put 方法,如下所示:

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

我的应用程序选择了 Guid,而不是新的 Item。如果我删除 Guid 并发送项目,我的应用程序会选择新项目。

我想知道我需要如何更改我的应用程序,以便我可以发送一个 Guid,并且应用程序也可以选择新的项目。

我用过Angular.toJson(item, false);但这似乎并没有改变我的 ASP.NET 应用程序接收信息的方式。

非常感谢

在您的代码中:

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

那么你发送 Put 还是 Post? 我认为这是一个问题

您不能将复杂类型与原始类型一起发送到 WebAPI 操作,您可以发送多个原始类型(Guid、int、字符串等)或单个复杂类型(Item).如果您想同时发送两者,解决方法是使用 JObject:

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

这样发自 angular:

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

从工作项目中提取

AngularJS:

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

WebAPI 控制器:

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

或模型列表

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

@Pakk,您的方法有效,因为第一个参数 "id" 作为查询字符串的一部分发送,只有第二个参数作为请求 body 的一部分发送。这是唯一有效的方法,从 body 发送多个是行不通的。