Ответ 1
Похоже, эти две строки были неправильными, я изменил их следующим образом:
contentType: 'application/json',
data: "{client: " + ko.toJSON(model.selectedClient()) + "}",
И теперь идет.
У меня есть следующее на контроллере API:
public void UpdateClient(Client client)
{
try
{
if (ModelState.IsValid)
{
db.Entry(client).State = EntityState.Modified;
db.SaveChanges();
}
}
catch
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
}
И на странице:
$.ajax({
url: "api/client/UpdateClient",
type: "PUT",
contentType: 'json',
data: ko.toJSON(model.selectedClient()),
success: function (result) {
getClients();
$("#loader").hide();
},
failure: function (result) {
alert(result.d);
$("#loader").hide();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("An error occurred, please try again.");
$("#loader").hide();
}
});
Но это дает ошибку 405 Method Not Allowed, может ли кто-нибудь увидеть, где я, возможно, ошибся? Для справки url для api в порядке, поскольку я использую один и тот же контроллер api для других функций.
Также выбранныйClient() является объектом Client, полученным через WebApi, поэтому должен идеально соответствовать PUT up снова.
Похоже, эти две строки были неправильными, я изменил их следующим образом:
contentType: 'application/json',
data: "{client: " + ko.toJSON(model.selectedClient()) + "}",
И теперь идет.
Если вы используете IIS7 и имеете WebDav, попробуйте удалить его. Я получал ту же ошибку только с глаголом PUT и решил проблему
Обновление: здесь вы можете прочитать о WebDav: http://www.iis.net/learn/get-started/whats-new-in-iis-7/what39s-new-for-webdav-and-iis-7
У вас есть атрибут [HttpPut] в действии UpdateClient? Кроме того, у вас есть маршрут, который принимает {действие} как routeTemplate? Например:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Еще одна вещь, попробуйте 'application/json' для типа контента в вашем ajax-коде вместо json.
Примечание для будущих разработчиков: я получил эту ошибку, когда мой контроллер "Путь" непреднамеренно ожидал дополнительного параметра, который не использовался.
Моя проблема заключалась в том, что в свойствах проекта я использовал локальную IIS вместо IIS Express, и по умолчанию был назначен порт 80, который блокировал запросы DELETE. Переход на IIS Express исправил его.