使用WebApi的jQuery -甚至不调用Controller方法

本文关键字:调用 Controller 方法 WebApi jQuery 使用 | 更新日期: 2023-09-27 18:01:23

很抱歉在问另一个问题后这么快就问了一个问题,但我现在正在努力解决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();
    }

现在在我看来,至少应该到达控制器。我的猜测是参数没有被正确传递,因此它正在寻找不同的方法,但我看不出为什么或如何纠正这一点。

任何帮助都将是非常感激的:)

Lex

编辑:根据要求,提供更多信息。

错误控制台上没有Javascript错误。

控制台日志显示如下内容:

{"Message":"没有找到与请求URI 'localhost:62997/api/Values'匹配的HTTP资源","MessageDetail":"在与请求匹配的控制器'Values'上没有找到任何操作。"}

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

"在控制器'Values'上找不到与请求匹配的操作"

get成功。(和POST我今天早上早些时候开始工作。)

使用WebApi的jQuery -甚至不调用Controller方法

像下面这样修改你的代码,然后它会正常工作:

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. 在删除现有资源时User DELETE,资源Id也应该在查询字符串中。

您正在执行一个没有指定对象ID的PUT请求。

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

您可以使用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>

添加以下配置到您的web。配置文件

<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>