jQuery与WebApi一起使用 - 甚至不调用Controller方法

Lex*_*ner 13 c# asp.net-mvc jquery asp.net-web-api

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

我有一个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 !');
            }
        })
Run Code Online (Sandbox Code Playgroud)

控制器看起来像这样:

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();
    }
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激 :)

莱克斯

编辑:根据要求,进一步的信息.

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

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

{"Message":"找不到与请求URI匹配的HTTP资源'localhost:62997/api/Values'.","MessageDetail":"在控制器上找不到与请求匹配的值'.}}

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

"没有找到与请求相匹配的控制器'值'的操作"

然而,获得成功.(而且我今早早些时候上班了.)

cuo*_*gle 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) {

    }
})
Run Code Online (Sandbox Code Playgroud)

使用REST时的最佳做法是:

  1. 创建新资源时用户POST.
  2. 更新现有资源时的用户PUT和资源的Id应该在URL中.
  3. 用户删除现有资源时删除,资源的Id也应该在查询字符串中.


Mar*_*nes 5

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

看到这里.

PUT请求中的URI标识请求附带的实体

更改

url: '/api/Values',
type: 'PUT',
Run Code Online (Sandbox Code Playgroud)

url: '/api/Values/' + truckId,
type: 'PUT',
Run Code Online (Sandbox Code Playgroud)

路由引擎需要id与您的方法匹配

public void Put(int id, TruckInfo obj)
Run Code Online (Sandbox Code Playgroud)

目前,您正试图将此项放入您的模型中:

id: truckId,
obj: {
   TruckId: truckId,
   //etc
Run Code Online (Sandbox Code Playgroud)

但这不起作用.只有一个对象可以从请求的主体中解除序列化.

只需将您的消息有效负载更改为此

var data = {
            TruckId: truckId,
            Reg: reg,
            Description: desc,
            Condition: condition
           }
Run Code Online (Sandbox Code Playgroud)

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

PUT http://localhost:62997/api/Values/1
Run Code Online (Sandbox Code Playgroud)