2013-04-03 2 views
0

Я работаю над веб-приложением в сети, используя ASP.NET MVC4 и Entity Framework. По одному из моих взглядов у меня есть список людей, которые могут быть огромными в будущем. Итак, чтобы упростить задачу, я хотел реализовать компонент поля автозаполнения с помощью jQuery UI и Json.MVC4 - автозаполнение с использованием Json

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

Мой Действие:

public ActionResult AutoComplete(string term) 
{ 
    BuSIMaterial.Models.BuSIMaterialEntities db = new Models.BuSIMaterialEntities(); 

    //var result = new [] {"A","B","C","D","E","F"}; with this, it works 

    var result = (from obj in db.Persons where obj.FirstName.ToLower().Contains(term.ToLower()) select obj).ToArray(); // with this, it doesn't work 

    return Json(result, JsonRequestBehavior.AllowGet); 
} 

Мой Вид:

@{ 
    ViewBag.Title = "Auto"; 
} 

<h2>Auto</h2> 

<label for="persons">Persons : </label><input type="text" id="persons" name="persons"/> 



@section Scripts 
{ 
    @Scripts.Render("~/bundles/jqueryval") 
    @Scripts.Render("~/bundles/jqueryui") 
    @Styles.Render("~/Content/themes/base/css") 

<script type="text/javascript" language="javascript"> 
     $(document).ready(function() { 
      $('#persons').autocomplete({ 
       source: '@Url.Action("AutoComplete")' 
      }); 
       }) 


</script> 
} 

Я попытался изменить свой тип возвращаемого значения (JsonResult вместо ActionResult), но ничего не меняется. Любая идея решить эту проблему?

+2

Не могли бы вы уточнить, что «не работает». Имеет ли ваш массив результатов какие-либо значения, например? –

+0

Когда я использовал отладчик, действительно есть значения в моей переменной результата. Я не знаю, почему, но автопредложение не работает, когда я использую свой db. – Traffy

ответ

3

Причина, по которой ваш код не работает, заключается в том, что вы пытаетесь отправить модель домена в представление, которое, скорее всего, содержит циклические ссылки в его графе объектов и не является сериализуемым JSON. Чтобы устранить эту проблему, выполните следующие действия:

public ActionResult AutoComplete(string term) 
{ 
    BuSIMaterial.Models.BuSIMaterialEntities db = new Models.BuSIMaterialEntities(); 

    //var result = new [] {"A","B","C","D","E","F"}; with this, it works 

    var result = db 
     .Persons 
     .Where(p => p.FirstName.ToLower().Contains(term.ToLower())) 
     .Select(p => p.FirstName) // <!-- That's the important bit you were missing 
     .ToList(); 

    return Json(result, JsonRequestBehavior.AllowGet); 
} 

Обратите внимание, как я проецировании Person объект в строку (с учетом только его FirstName). В вашем примере вы непосредственно принимали весь объект Person, который не имеет смысла для плагина автозаполнения, поскольку вам нужно отправить массив строк в представление.

+0

Действительно, это работает ... Мне было интересно, почему это не сработало, и вы просто объяснили это блестяще. Еще раз спасибо. Просто последний вопрос: у меня есть метод «FullName», который объединяет имя и фамилию, и я хочу отобразить его, выполнив p => p.FullName. Однако Visual Studio говорит: 'Указанный член типа 'FullName' не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, элементы сущности и свойства навигации сущности. ' – Traffy

+1

Вы можете сначала выполнить запрос, а затем выполнить проект:' .Where (p => p.FirstName.ToLower(). Содержит (term.ToLower())). ToList(). Выберите (p => p.FullName) .ToList() '. –

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