2014-01-27 3 views
1

У меня есть веб-метод, возвращающий объект, и мне трудно получить доступ к объекту, возвращенному методом jQuery Ajax. Я хотел бы получить доступ к HighlightResults и отобразить в ретрансляторе. Я продолжаю получать ошибку: произошла ошибка обработки запроса. Внутренняя ошибка сервера.jQuery ajax webmethod error

Мой объект:

public class SearchResults 
    { 
    internal SearchResults() 
    { 

    } 

    public virtual IQueryable<Document> DocumentResults { get; internal set; } 
    public virtual IQueryable<Page> PageResults { get; internal set; } 
    public virtual IQueryable<Word> WordResults { get; internal set; } 
    public ICollection<String> HighlightResults { get; internal set; } 
    public int QueryTime { get; internal set; } 
    public int TotalResults { get; internal set; } 

} 

И моя Аякса функция:

var query = String($('[id$=txtSearch]').val());    
     $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      url: "Viewer.aspx/GetHighlightResults", 
      dataType: "json", 
      data: JSON.stringify({docID: docid, query: query, 
        pageNumber: 1, resultsPerPage: 10}), 
      success: function (response) { 
       alert("Success!!");     
       var data = response.d; 

       // none of these are displaying.... 
       alert(String(data)); 
       alert(String(data.HighlightResults)); 
       alert(String(data.HighlightResults[0])); 

       $.each(data, function(index, item) { 
        alert(item); 
        alert(item.HighlightResults); 

        $("#search-results").append("<b>" + item + "</b>"); 
       }) 
      }, 
      error: function (xhr, status, error) { 
       alert("responseText=" + xhr.responseText + 
         "\n textStatus=" + status + "\n errorThrown=" + error); 
      } 
     }); 

И, наконец, мой веб-метод:

[WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public static SearchResults GetHighlightResults(String docID, String query, 
        String pageNumber, String resultsPerPage) 
    { 
     SearchResults results = null; 
     try 
     { 
      ArchiveSearcher searcher = new ArchiveSearcher(); 
      if (!String.IsNullOrEmpty(query) && Convert.ToInt32(docID) > 0 && 
       Convert.ToInt32(pageNumber) > 0 && Convert.ToInt32(resultsPerPage) > 0) 
      { 
       results = searcher.SearchDocument(Convert.ToInt32(docID), query, 
       Convert.ToInt32(pageNumber), Convert.ToInt32(resultsPerPage)); 
      } 
     } 
     catch (Exception ex) 
     { 
      // Log the exception. 
      ArchiveViewer.Logic.ExceptionUtility.LogException(ex, "GetSearchResults in Viewer.aspx.cs"); 
     } 
     return results; 
    } 

Помощь ценится.

EDIT: Если я вернуть ICollection<String> Highlight результаты из веб-метод, я могу получить доступ к нему с помощью функции JQuery Ajax с помощью:

success: function (response) { 
    var data = response.d; 
    $.each(data, function(index, item) { 
     alert(item); 
.... 

Я думаю, что моя проблема связана с тем, как я достигаю весь SearchResults объект. Любые идеи относительно того, что я делаю неправильно?

EDIT 2: Я прокомментировал все в моей функции успеха ajax и все еще не удается. Поэтому проблема заключается в возврате класса. Есть идеи?

+0

попал ли он в WebMethod при отладке? – Zaki

+0

Да, и я что-то возвращаю. Но он не атакует («Успех !!»); Вместо этого я получаю ошибку. – Tums

+0

это ошибка 500? – Zaki

ответ

0

Ahhh !!! Я понял. Спасибо, Заки, ты подтолкнул меня в правильном направлении!

У меня не было ошибок в веб-методе, но произошло исключение, когда мой объект сериализовался в JSON. Проблема заключается в сериализации IQueryable<T> в моем классе. Я изменил его на List<T>, и теперь все работает. (! День моей жизни ушел)

Просто чтобы быть полным, правильный путь для доступа к объектам быть возвращены в клиенте:

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "Viewer.aspx/GetSearchResults", 
    dataType: "json", 
    data: JSON.stringify({ docID: docid, query: query, pageNumber: 1, resultsPerPage: 10 }), 
    success: function (response) { 
     var data = response.d.HighlightResults; 
     $.each(data, function (index, item) { 
      $("#search-results").append("<b>" + item + "</b>"); 
     }) 
    } 
...... 
0

Через JQuery AJAX вы передаете данные JSON.stringify, но в вашем методе вы получите его в качестве обычной строки

Проверьте с этой опорной линией https://stackoverflow.com/a/6323528/2641723

+0

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

0

Я сделал то же самое в тестовом проекте и вернулся к успеху. Я могу видеть предупреждение стрельбы:

вот что я изменил в объекте:

public virtual IQueryable<string> DocumentResults { get; internal set; } 
    public virtual IQueryable<Page> PageResults { get; internal set; } 
    public virtual IQueryable<string> WordResults { get; internal set; } 

затем в AJAX:

data: JSON.stringify({ 
       docID: 'test', 
       query: 'tet2', 
       pageNumber: 1, 
       resultsPerPage: 10 
      }), 

и:

[WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public static SearchResults GetHighlightResults(String docID, String query, 
         String pageNumber, String resultsPerPage) 
     { 
      SearchResults results = null; 
      try 
      { 
       results = new SearchResults(); 
      } 
      catch (Exception ex) 
      { 
       // Log the exception. 
       //ArchiveViewer.Logic.ExceptionUtility.LogException(ex, "GetSearchResults in Viewer.aspx.cs"); 
      } 
      return results; 
     } 

Я предлагаю вам проверить что в веб-методе нет никаких исключений.

+0

Мне нужно отправить обратно свои пользовательские классы (Документ и Word). К сожалению, строки недостаточно. :( – Tums