13

很抱歉在问了另一个问题后这么快就问了这个问题,但我现在正在为 PUT 苦苦挣扎。

我有一个 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 'localhost:62997/api/Values' 匹配的 HTTP 资源。","MessageDetail":"在控制器 'Values' 上找不到与请求匹配的操作。"}

在 JSON 控制台的 MessageDetail 下,我得到了这个(这支持我认为不正确参数的理论)

“在与请求匹配的控制器‘值’上找不到任何操作”

但是 get 成功了。(还有我今天早上早些时候开始工作的帖子。)

4

4 回答 4

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. 创建新资源时的用户 POST。
  2. 更新现有资源时的用户 PUT 和资源的 Id 应该在 URL 中。
  3. 删除现有资源时的用户 DELETE 并且资源的 Id 也应该在查询字符串中。
于 2013-02-26T11:21:37.370 回答
5

您正在执行 PUT 请求而不指定对象的 ID。

这里

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
           }

并使用正确的 url 结构,例如:

PUT http://localhost:62997/api/Values/1
于 2013-02-26T11:17:35.790 回答
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>
于 2013-02-26T11:19:17.417 回答
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>
于 2015-03-13T11:41:47.837 回答