Подтвердить что ты не робот

JQuery, помещенный в WebApi - даже не вызов метода контроллера

Извините, что задал вопрос об этом, так как вскоре задал другой вопрос, но теперь я борюсь с PUT.

У меня есть метод jQuery, который собирает данные и передает его функции PUT в контроллере values. Но контроллер даже не вызывается (поскольку у меня есть точка останова на нем, и он не прерывается)

Могу ли я просто проверить свой 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 на консоли ошибок.

В журнале консоли отображается следующее:

{ "Сообщение": "HTTP-ресурс не найден, что соответствует запросу URI" localhost: 62997/api/Values ​​ ".", "MessageDetail": "Никакого действия не найдено на контроллере" Значения ", которое соответствует запросу." }

И под MessageDetail для консоли JSON я получаю это (что поддерживает мою теорию по неправильным параметрам, я думаю)

"На контроллере" Значения "не найдено никаких действий, которые соответствуют запросу"

Получается, однако, успех. (И ПОСТ, я работал сегодня утром).

4b9b3361

Ответ 1

Измените свой код, как показано ниже, и он будет работать нормально:

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:

  • Пользовательский POST при создании нового ресурса.
  • Пользовательский PUT при обновлении существующего ресурса и Идентификатор ресурса должен находиться в URL-адресе.
  • Пользователь DELETE при удалении существующего ресурса и Идентификатора ресурса также должен быть в строке запроса.

Ответ 2

Вы выполняете запрос PUT без указания идентификатора объекта.

Смотрите здесь.

URI в запросе PUT идентифицирует объект, заключенный с Запрос

Изменить

url: '/api/Values',
type: 'PUT',

To

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

Ответ 3

Вы можете использовать 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>

Ответ 4

добавьте следующую конфигурацию в файл 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>