很抱歉在提出另一个问题之后很快就问这个问题,但我现在正在努力解决这个问题。
我有一个jQuery方法,它收集数据并将其传递给valuescontroller中的PUT函数。但控制器甚至没有被调用(因为我有一个断点,它没有破坏)
我可以检查一下我的jQuery是否正确?
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 !');
}
})
控制器如下所示:
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匹配的HTTP资源'localhost:62997 / api / Values'。”,“MessageDetail”:“在控制器上找不到与请求匹配的值' 。“}
在JSON控制台的MessageDetail下,我得到了这个(我认为这支持了关于错误参数的理论)
“未找到与请求匹配的控制器'值'的操作”
然而,获得成功。 (而且我今早早些时候上班了。)答案 0 :(得分: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时的最佳做法是:
答案 1 :(得分:5)
您正在执行PUT请求而未指定对象的ID。
请参阅here。
PUT请求中的URI标识随附的实体 请求
更改
url: '/api/Values',
type: 'PUT',
到
url: '/api/Values/' + truckId,
type: 'PUT',
路由引擎需要id
才能与您的方法匹配
public void Put(int id, TruckInfo obj)
目前您正试图将此信息放入您的模型中:
id: truckId,
obj: {
TruckId: truckId,
//etc
但这不起作用。只有一个对象可以从请求正文中解除序列化。
只需将您的消息有效负载更改为此
即可var data = {
TruckId: truckId,
Reg: reg,
Description: desc,
Condition: condition
}
并使用正确的网址结构,例如:
PUT http://localhost:62997/api/Values/1
答案 2 :(得分:0)
您可以使用Firebug或类似的浏览器插件来检查所做的请求以及服务器给出的响应。
IIS也可以拒绝PUT
动词。我遇到了同样的问题。如果是这种情况,您应该可以通过在web.config
文件中更改或添加这些处理程序来修复它(<system.webServer>
部分):
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
答案 3 :(得分:0)
将以下配置添加到您的web.config文件
<system.webServer>
<handlers>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>