2014-03-14 2 views
1

Я выдавать запрос PATCH на мой сервер, чтобы обновить название:Как указать успех с помощью Web API 2?

$.ajax({ 
    url: Settings.get('serverURL') + 'Playlist/UpdateTitle', 
    type: 'PATCH', 
    dataType: 'json', 
    data: { 
     id: model.get('id'), 
     title: title 
    }, 
    success: function() { 
     console.log("Success!"); 
    }, 
    error: function (error) { 
     console.error("Failure!"); 
    } 
}); 

[Route("UpdateTitle")] 
[HttpPatch] 
public IHttpActionResult UpdateTitle(PlaylistDto playlistDto) 
{ 
    using (ITransaction transaction = Session.BeginTransaction()) 
    { 
     PlaylistManager.UpdateTitle(playlistDto.Id, playlistDto.Title); 

     transaction.Commit(); 
    } 

    return Ok(); 
} 

Все здорово работает на то, что ошибка обратного вызова AJAX запрос является выполненной и не успех обратного вызова, за исключением.

Перед использованием Web API 2, я использовал следующий метод, который не имел проблемы. Очевидно, что проблема в том, что я возвращающая Ok результат вместо успеха объекта JSON:

[HttpPost] 
public JsonResult UpdateTitle(Guid playlistId, string title) 
{ 
    using (ITransaction transaction = Session.BeginTransaction()) 
    { 
     PlaylistManager.UpdateTitle(playlistId, title); 

     transaction.Commit(); 
    } 

    return Json(new 
     { 
      success = true 
     }); 
} 

Что такое правильный способ, чтобы указать успех веб-API 2?

ответ

4

Проблема на самом деле довольно проста:

dataType: 'json', 

говорит JQuery, чтобы не использовать интеллектуальный угадывание для типа ответа сервера. Он выдаст ошибку, если сервер не отвечает json. Если я просто удалю это свойство, тогда все будет работать так, как ожидалось.

+1

Возможно, было бы лучше использовать код состояния 204 (без содержимого), если вы ничего не возвращаете. –

+0

Хорошая идея! Я это сделаю! –

3

Вернуть HttpResponseMessage и установите StatusCode на OK:

public HttpResonseMessage UpdateTitle() { 
    ... 
    return Request.CreateResponse(HttpStatusCode.OK); 
}  
+0

Но я считаю, что в Web API 2 более целесообразно использовать IHttpActionResult. См. Эту тему: http://stackoverflow.com/questions/21758615/why-should-i-use-ihttpactionresult-instead-of-httpresponsemessage О, на самом деле, ваше решение не решает проблему, к сожалению. :( –

+0

О, ничего себе, я не знал о новой абстракции HttpResponseMessage. Я думал, что Ok() - это то, что вы написали. Я бы предположил, что их OK() просто делает то же самое, что и мой ответ. ударив обратный вызов ошибки, я бы догадался, что проблема связана не с api, а с клиентской стороной. Поразите свое действие с помощью скрипача и проверьте ответ - вы должны получить 200 OK, если вы сохраняете Ok(). –

+1

Это была ошибка с моим javascript. Я не должен был указывать, что ожидал ответ от json с сервера, когда он не отправляет никаких данных. :) Легкий peasy! –