C# jQuery与WebApi结合使用-甚至不调用控制器方法

C# jQuery与WebApi结合使用-甚至不调用控制器方法,c#,jquery,asp.net-mvc,asp.net-web-api,C#,Jquery,Asp.net Mvc,Asp.net Web Api,很抱歉,在问了另一个问题后这么快就提出了一个问题,但我现在正在努力解决这个问题 我有一个jQuery方法,它收集数据并将其传递给valuescontroller中的PUT函数。但是控制器甚至没有被调用(因为我有一个断点,它没有中断) 我可以检查我的jQuery是否正确吗 var data = { id: truckId, obj: { TruckId: truckId, Reg: re

很抱歉,在问了另一个问题后这么快就提出了一个问题,但我现在正在努力解决这个问题

我有一个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成功了。(还有我今天早上早些时候写的帖子。)

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

PUT请求中的URI标识由 请求

改变

url: '/api/Values',
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
文件(部分
)中更改或添加这些处理程序来修复它:


如下图所示更改代码,它将正常工作:

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时的最佳实践是:

  • 用户在创建新资源时发布
  • 更新现有资源时的用户放置,资源Id应位于URL中
  • 删除现有资源时用户删除,资源Id也应在查询字符串中

  • 将以下配置添加到web.config文件中

    
    
    您是否收到任何JS错误?您是否可以在
    .ajax
    调用之前添加一个
    console.log(json)
    ,并在
    success
    函数中添加一个(如
    console.log(results)
    所以你知道JS确实发送了一些东西吗?PUT请求应该指向可识别的资源。在这里使用查询参数是不合适的…当然应该是/api/Values/?+1的路由,以提醒我路由引擎为什么与url模式不匹配。我假设它足够聪明,可以获取id从数据对象。
    <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>
    
    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) {
    
        }
    })