使用 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 发送多个是行不通的。
我的 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 发送多个是行不通的。