jQuery put with WebApi - Not even calling the Controller method
很抱歉在提出另一个问题后不久就问这个问题,但是我现在正为PUT苦苦挣扎。
我有一个jQuery方法,它收集数据并将其传递给valuescontroller中的PUT函数。但是控制器甚至都没有被调用(因为我有一个断点并且它没有断)
我可以检查一下我的jQuery是否正确吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var data = { id: truckId, obj: { TruckId: truckId, Reg: reg, Description: desc, Condition: condition } }; var json = JSON.stringify(data) $.ajax({ url: '/api/Values', type: 'PUT', contentType:"application/json; charset=utf-8", data: json, success: function (results) { $.getJSON("api/Values", LoadTrucks); alert('Truck Updated !'); } }) |
控制器如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public void Put(int id, TruckInfo obj) { WebApiTestEntities db = new WebApiTestEntities(); var data = from item in db.TruckInfoes where item.TruckId == id select item; TruckInfo oldRecord = data.SingleOrDefault(); oldRecord.Reg = obj.Reg; oldRecord.Description = obj.Description; oldRecord.Condition = obj.Condition; db.SaveChanges(); } |
现在在我看来,至少应该到达控制器。我的猜测是参数传递不正确,因此它正在寻找不同的方法,但是我看不到为什么或如何纠正它。
任何帮助将不胜感激 :)
莱克斯
编辑:根据要求,更多信息。
错误控制台上没有Javascript错误。
控制台日志显示以下内容:
{" Message":"未找到与请求URI'localhost:62997 / api / Values'匹配的HTTP资源。"," MessageDetail":"在与请求匹配的控制器'Values'上未找到任何操作。"}
在JSON控制台的MessageDetail下,我得到了这个(我认为这支持我关于错误参数的理论)
"在与请求匹配的控制器"值"上未找到任何操作"
但是获取成功。 (还有今天早上我上班的POST。)
如下更改代码,即可正常工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var data = { TruckId: truckId, Reg: reg, Description: desc, Condition: condition }; var json = JSON.stringify(data) $.ajax({ url: '/api/Values/' + truckId, type: 'PUT', contentType:"application/json; charset=utf-8", data: json, success: function (results) { } }) |
使用REST的最佳实践是:
您正在执行PUT请求而未指定对象的ID。
看这里。
the URI in a PUT request identifies the entity enclosed with the
request
更改
1 2 | url: '/api/Values', type: 'PUT', |
至
1 2 | url: '/api/Values/' + truckId, type: 'PUT', |
路由引擎将需要
1 | public void Put(int id, TruckInfo obj) |
目前,您正在尝试将其放在此处的模型中:
1 2 3 4 | id: truckId, obj: { TruckId: truckId, //etc |
但这是行不通的。从请求的主体中只能反序列化一个对象。
只需将您的消息有效负载更改为此
1 2 3 4 5 6 | var data = { TruckId: truckId, Reg: reg, Description: desc, Condition: condition } |
并使用正确的网址结构,例如:
1 | PUT http://localhost:62997/api/Values/1 |
将以下配置添加到您的web.config文件中
1 2 3 4 5 | <system.webServer> <handlers> </handlers> </system.webServer> |
您可以使用Firebug或类似的浏览器插件来检查发出的请求和服务器给出的响应。
IIS也可能拒绝
1 2 3 4 5 6 7 8 | <handlers> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> </handlers> |