2012-06-02 3 views
1

Я реализую автозаполнение jQuery в текстовом поле, и мне любопытно, будет ли мой код выглядеть правильно.вернуть список <> из модели в EF MVC3

Это мое текстовое поле с моего экрана.

<div class="editor-field"> 
    @Html.TextBoxFor(model => model.Customer.CustomerName, 
             new {id = "CustByName" }) 
</div> 

javascript для реализации автозаполнения для идентификатора текстового поля.

$(document).ready(function() { 
$("#CustByName").autocomplete({ 
    source: function (request, response) { 
     $.ajax({ 
      url: "/Cases/FindByName", type: "GET", dataType: "json", 
      data: { searchText: request.term, maxResults: 10 }, 
      success: function (data) { 
       response($.map(data, function (item) { 
        return { 
         label: item.CustomerName, 
         value: item.CustomerName, 
         id: item.CustomerID } 
       })) 
      } 
     }) 
    } 
}); 

});

Здесь действие контроллера вызывается JavaScript:

public JsonResult FindByName(string searchText, int maxResults) 
{ 
    CustomerFind find = new CustomerFind(); 
    var result = find.FindCustomerByName(searchText, maxResults); 
    return Json(result); 
} 

Вот функция в CustomerFind называется FindCustomerByName:

internal List<Models.Customer> 
       FindCustomerByName(string searchText, int maxResults) 
{ 
     List<Models.Customer> cust = new List<Customer>(); 
     var result = from c in cust 
        where c.CustomerName.Contains(searchText) 
        orderby c.CustomerName 
        select c; 
     return result.Take(maxResults).ToList(); 
} 

Вот что у меня есть в моем макета cshtml файл для справки сценария ,

<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 
<link href="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.20/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" /> 
<script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.7.2.min.js" type="text/javascript"></script> 
<script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.20/jquery-ui.min.js" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/rls-functions.js")" type="text/javascript"></script>" 

Все, кажется, работает нормально, за исключением запроса LINQ в FindCustomerByName не возвращает никаких записей, даже если они существуют.

Может ли кто-нибудь предложить, что может быть проблемой, или предложить лучший способ сделать автозаполнение?

Я рассмотрел многочисленные примеры и собрал это вместе.

+1

Вы отлаживаете это? ** (1) ** Установите точку останова в методе действия 'findbyname' и посмотрите, не получили ли он правильные аргументы. ** (2) ** Используйте firebug + firefox или Chrome (нажмите F12). Проверьте сеть, чтобы убедиться, что запрос и ответ сформированы правильно. – gideon

+0

Смотрите здесь: http://www.shahnawazk.com/2010/07/jquery-ui-autocomplete-widget-with.html или здесь http://carlhoerberg.com/how-to-use-jqueryu-ui-autocomplete -with-aspnet –

+0

Привет, гидеон, метод действия findbyname получает правильные аргументы. Кажется, что FindCustomerByName LINQ не работает. Javascript запускается с помощью текстового поля, и он отлично добирается до FindByName, но перечисление не возвращает никаких результатов в FindCustomerByName. Я проверил, что есть данные, соответствующие поисковому тексту. – Ryan

ответ

1

Второе обновление. Найдено пару синтаксических ошибок

$(document).ready(function() { 
    $("#CustByName").autocomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       url: "/Cases/FindByName", type: "GET", dataType: "json", 
       data: { searchText: request.term, maxResults: 10 }, 
       success: function (data) { 
        response($.map(data, function (item) { 
         return { 
          label: item.CustomerName, 
          value: item.CustomerName, 
          id: item.CustomerID } 
        })); // <--- semicolon here 
       } 
      }); // <--- semicolon here 
     }, 
     minLength: 3 // <-- sets the minimum number of characters to type before ajax fires 
    }); 
}); 

Обновление на основе ОП, не имея контекста дб, что он получает данные от

Вот пример того, что делает запрос к базе данных с использованием EF. Сначала необходимо создать контекст базы данных, а затем использовать этот контекст здесь в коде.

public IList<Lender> GetLenders(string partialText) { 
    IList<Lender> lenders; 

    // Create data connection to the LINQ to SQL class that represents the database 
    using (DBDataContext dataContext = new DBDataContext()) { 

     // Get all lenders where lender name contains partial text and put them into new Lender objects 
     // The final call .ToList() puts all the Lender objects into a collection that can be enumerated 
     lenders = (from data 
         in dataContext.LenderDBs 
        orderby data.LenderName 
        where data.IsActive == true 
         && data.LenderName.ToLower().Contains(partialText.ToLower()) 
        select new Lender { 
         LenderName = data.LenderName, 
         URL = data.URL 
        }).Take(15).ToList(); 
    } 
    return lenders; 
} 

Ваш TextBoxFor отсутствует класс, который создает функцию автозаполнения class="ui-widget", но и убедиться, что у вас есть этот скрипт в макете для стайлинга выпадающего меню

<link href="@Url.Content("~/Content/themes/base/jquery.ui.all.css")" rel="stylesheet" type="text/css" /> 

@Html.TextBoxFor(model => model.Customer.CustomerName, 
            new {id = "CustByName", @class = "ui-widget" }) 

И ваши действия необходимо разрешить возвращение Json, разрешив Get в обратном направлении

public JsonResult FindByName(string searchText, int maxResults) 
{ 
    CustomerFind find = new CustomerFind(); 
    var result = find.FindCustomerByName(searchText, maxResults); 
    return Json(result, JsonRequestBehavior.AllowGet); 
} 

Помимо всего прочего, я вижу только следующее: contentType: "application/json; charset=utf-8" отсутствует в вашем запросе ajax. Попробуйте положить alert(data); непосредственно перед оператором response в разделе success. Если это не удар, то Аякс erroring


Кроме того, как отдельный интерес, вы отправляете в maxResults вернуть ваши данные, но ваши данные фактически возвращаются все строки, в которых searchText матчи, а затем, как только он получает для вашего клиента он принимает maxResults.Я бы изменил это так, чтобы maxResults был частью вашего запроса, поэтому вы не возвращаете больше данных, чем необходимо. Фактически, я бы поставил maxResults в качестве настраиваемой опции в файле web.config. Пользовательский интерфейс не должен касаться таких правил.

Я профилировал, используя код как ваш orignal и код, как показано ниже. Если вы будете наблюдать за выполнением SQL Server, сервер вернет все строки с совпадением с кодом, который у вас был выше. Но код ниже будет создать условие Top 10 так, что только 10 строк возвращаются

internal List<Models.Customer> FindCustomerByName(string searchText, int maxResults) 
{ 
     List<Models.Customer> cust = new List<Customer>(); 
     var result = (from c in cust 
        where c.CustomerName.Contains(searchText) 
        orderby c.CustomerName 
        select c).Take(maxResults).ToList(); 
     return result; 
} 
+0

Теперь я получаю данные :) Я сделал это: 'внутренний код FindCustomerByName (string searchText, int maxResults)' { Список результатов ; использованием (cummins_sqldb DataContext = новый cummins_sqldb()) { результат = (от гр в dataContext.Customers , где c.CustomerName.Contains (SearchText) OrderBy c.CustomerName выберите с) .Снять (maxResults). К списку(); } результат возврата; } – Ryan

+0

Удивительный! так что теперь все работает? –

+0

ну, не получив фактического автозаполнения, но на шаг ближе. Теперь мне нужно посмотреть, как выглядит ответ ajax в js – Ryan

1

Вы забирающий свой результат из пустого списка:

List<Models.Customer> cust = new List<Customer>(); 

Вы, наверное, нужно что-то вроде:

List<Models.Customer> cust = ....... <- call your db code here. 
+0

+1 Хороший улов, он даже не звонит в ДБ, который я вижу. –

+0

Спасибо, Джон. Я не уверен, что понимаю. Я не должен использовать новый Список () ;? – Ryan

+0

Вы должны, он просто пуст в соответствии с кодом здесь ... мы не видим кода, в котором вы получаете список клиентов из своего Db с помощью dbcontext ... Я обновлю свой пример ответа –

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