2

AJAX прекрасно работает с GetAll метода, который возвращает IQueryable, но с GetOne, он не работает, и вернуть «неопределенными» в браузере, здесь метод Get в ApiController классе:Вызов метода GET, возвращающего IHttpActionResult из AJAX?

[ResponseType(typeof(Author))] 
public IHttpActionResult GetAuthor(int id) 
{ 
    Author author = db.Authors.Find(id); 
    if (author == null) 
    { 
     return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.NotFound, $"Author with {id} not found.")); 
    } 

    return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, author)); 
} 

это функция AJAX:

$.ajax({ 
    type: 'GET', 
    url: 'api/Authors', 
    dataType: 'json', 
    data:{id:'1'}, 
    success: function (data) { 
     list.empty(); 
     $.each(data, function (index, val) { 
      var qualifier = val.AuthorId + ' - ' + val.Name; 
      list.append('<li>'+qualifier+'</li>') 
     }); 
    } 
}); 

является ли это потому, что GetAuthor возвращается IHttpActionResult?

GetAuthors:

public IQueryable<Author> GetAuthors() 
{ 
    return db.Authors; 
} 

Скриншот из окна консоли:

enter image description here

+0

Чтобы проверить, является ли ответ действительный формат JSON (это то, что ожидает Ajax здесь), вы можете добавить после успеха эту функцию 'complete: function (data) {console.log (data)}' и проверить вывод. Это может быть проблемой с async или с возвращенным форматом JSON. –

+0

И можем ли мы увидеть код для GetAll? –

+0

Я добавил код, проверьте его!] –

ответ

3

Является ли это потому, что GetAuthor возвращает IHttpActionResult

НЕТ! Проблема в том, как вы имеете дело с ответом, полученным от запроса.

Пример действия возвращает одного автора, но рассматривается как коллекция на клиенте.

function GetData(id) { 
    var url = 'api/Authors'; 
    if(id) url = url + '?id=' + id; 
    $.ajax({ 
     type: 'GET', 
     url: url, 
     dataType: 'json', 
     success: function (data) { 
      list.empty(); 
      if (!jQuery.isArray(data)) data = [data]; // If a single object is returned, wrap it in an array 
      $.each(data, function (index, val) { 
       var qualifier = val.AuthorId + ' - ' + val.Name; 
       list.append('<li>'+qualifier+'</li>') 
      }); 
     } 
    }); 
} 
+0

Я все еще получаю ту же ошибку –

+0

, когда вы отлаживаете выполняемое действие и каково значение id при отладке? положите точку останова в действии и отметьте – Nkosi

+0

Да, он выполняется с обоими подходами (ваш и ум с использованием 'data'), а Id - 1 или что-то, что я передаю –

1

Как обсуждалось в течение беседы, мы подтвердили, что ответ был success.

Однако значение data не массив, а возвращал нечто эквивалентное:

{ 
    AuthorId: 1, 
    Book: null, 
    Name: "Name here" 
} 

Поэтому следующий JQuery код success будет действителен:

success: function(data){ 
    var qualifier = data.AuthorId + ' - ' + data.Name; 
    list.append('<li>'+qualifier+'</li>'); 
} 
+0

К сожалению, он будет работать только с одним объектом, я хочу использовать его либо со списком объекта, либо с одним автором, исходя из выбора пользователя. –

+1

Затем попробуйте, что @Nkosi предложил перед '$ .each': 'if (! jQuery.isArray (data)) data = [data]; // Если возвращается один объект, заверните его в массив ' –

Смежные вопросы