2013-04-25 2 views
3

Ниже вызов Ajax, завернутый внутри автозаполнения jQuery source. проверяя возвращаемое значение в Fiddler, а также в консоли консоли Chrome, я вижу, что данные возвращаются в представление и в правильном формате.jQuery autocomplete не отображает данные, возвращенные с вызова Ajax

Однако обычный список элементов, возникающих при вводе пользователем, не отображается. Вы можете набрать так же быстро и медленно, сколько хотите, и ничего не появится.

Я установил точку останова в методе контроллера (это сайт ASP MVC), чтобы убедиться, что часть программы функционирует нормально, и она срабатывает каждый раз.

Я всего лишь несколько недель новичок в jQuery, поэтому любая помощь будет принята с благодарностью. Благодаря!

$(function() { 
    $('#DRMCompanyId').autocomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       url: '@Url.Action("compSearch", "AgentTransmission")', 
       type: 'GET', 
       dataType: 'json', 
       data: request, 
       success: function (data) { 
         alert(data); 
         response($.map(function (value, key) { 
          alert(value); 
         return { 
          label: value, 
          value: key 
         }; 
        })); 
       } 
      }); 
     }, 
     minLength: 1 
    }); 
}); 

EDIT

Я добавил пару alerts к коду. alert(data) будет стрелять, но alert(value) не будет.

Вот копия возвращенного json от отладки консоли Хрома

enter image description here

А вот метод контроллера, который возвращает пару ключ/значение в виде Dictionary объекта.

  XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable); 
      nsmgr.AddNamespace("m", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"); 
      nsmgr.AddNamespace("d", "http://schemas.microsoft.com/ado/2007/08/dataservices"); 

      Dictionary<string, string> companies = new Dictionary<string, string>(); 

      foreach (XmlNode childNode in parentNode) 
      { 
       if (!String.IsNullOrWhiteSpace(childNode["content"].InnerText)) 
       { 
        try 
        { 
         string name = childNode["title"].InnerText; 
         string id = childNode["content"].InnerText.Substring(0, 6); 

         companies.Add(id, name); 
        } 
        catch (Exception ex) 
        { 

        } 
       } 
      } 

      return Json(companies, JsonRequestBehavior.AllowGet); 
     } 
     catch (Exception ex) 
     { 
      results = ex.InnerException.ToString(); 
     } 

     return Json(results, JsonRequestBehavior.AllowGet); 
+0

вы можете показать свой json? –

+0

Вы имеете в виду возвращенные значения или где они установлены в контроллере? – NealR

+0

Я имею в виду возвращенный json .. –

ответ

1

Функция $ .map ожидает массив/объект перечислять дальше, в качестве первого аргумента. ref jQuery.map.

попытка изменения

$.map(function (value, key) { 

в

$.map(data, function (value, key) { 

С уважением.

0

Документация JQuery: http://api.jquery.com/jQuery.map/ говорит, что функция $.map два параметра; первый из которых является массивом. Я думаю, что вам нужно использовать метод $.each.

Я также считаю, что в этом контексте response является функцией обратного вызова, которую вы должны использовать с данными AJAX в качестве параметра, как в response(data).

Стрельба из бедра здесь, я думаю, что ваш обработчик успеха должен выглядеть примерно так:

  success: function (data) { 
        var x, array = []; 
        for(x in data) { 
         array.push({ 
          label: data[x].value, 
          value: data[x].key  
         }; 
        } 
        response(data); 
      } 
Смежные вопросы