Лучшая практика для отправки веб-формы asp.net в JQuery Autocomplete - PullRequest
3 голосов
/ 10 мая 2011

Что я хочу сделать, это получить все электронные письма из столбца Электронная почта таблицы клиентов MS SQL и заполнить их с помощью функции автозаполнения JQuery.Текущая система использует VB.NET 2.0.

Что я сделал, так это получил все электронные письма и поместил их в DataTable, перебрал и поместил их в строку, ограниченную символом ",".Поместите эту строку в скрытую коробку.JQuery извлекает значение из этого скрытого поля и создает массив, используя "array = emails.split (", ");".Вот код.

Он довольно хорошо работает на сервере разработки, поскольку у нас есть только более 2000 записей, но он загружается вечно, когда я помещаю его на живой сервер, где более 80 000 записей.

Front End

    <script type="text/javascript">
    $(function() {      
            var emails = $("#EmailList").val();
            var emailList = emails.split(",");

            $(".email-autocomplete").autocomplete({
                source: emailList
            });
        });

    </script>   
    <asp:TextBox class="email-autocomplete" ID="txtEmailAddress" 
runat="server" style="width:300px"></asp:TextBox>                                                                           
    <asp:HiddenField ID="EmailList" runat="server" />

Back End

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    FetchEmailList()

End Sub

Private Sub FetchEmailList()
        Dim dt As Data.DataTable = GetCustomers()
    Dim i As Integer
    Dim _emails As String

    For i = 0 To dt.Rows.Count()-1
    If IsDBNull(dt.Rows(i).Item("Email")) = False Then
       _emails &= dt.Rows(i).Item("Email") &  ","
    End If
    Next

    If _emails.length > 0 Then
        EmailList.Value = _emails.substring(0,_emails.length-1)
    End If

End Sub

Я предлагаю два решения -

  1. Когда я получаю электронные письма с сервера базы данных,Я буду использовать функцию TableToStr и помещу все электронные письма, разделенные символом ",", в одно поле, а VB.NET получит эти значения и поместит их в скрытое поле.Здесь мы можем удалить Looping через datatable в конце.Однако JQuery все еще нужно «разбить» эту строку для построения массива.

  2. Получать электронные письма из БД, собирать JSON и возвращать их в JQuery. (Я сделал это в ASP.NETMVC3 с C #, который довольно легко использовать с помощью «return JSON», но нужно провести некоторые исследования, как это сделать в VB.NET 2.0).

Что является лучшим методом для работы с автозаполнениемкогда наш источник данных довольно большой.

1 Ответ

2 голосов
/ 10 мая 2011

Прежде всего, я бы переместил ваш код конца в общий файл HttpHandler (.ashx), а затем вызвал этот файл из автозаполнения jQuery через AJAX.Кроме того, кэширование ответа AJAX повысит производительность.

<script type="text/javascript>
$(function() {
    var cache = {},
        lastXhr;
    $(".email-autocomplete").autocomplete({
        minLength: 2,
        source: function( request, response ) {
            var term = request.term;
            if ( term in cache ) {
                response( cache[ term ] );
                return;
            }

            lastXhr = $.getJSON( "getEmails.ashx", request, function( data, status, xhr ) {
                cache[ term ] = data;
                if ( xhr === lastXhr ) {
                    response( data );
                }
            });
        }
    });
});
</script>

* адаптировано из демонстрации пользовательского интерфейса jQuery

Ответ JSON может быть таким простым: { "emails" : ["email1@email.com", "email2@email.com", "email3@email.com"]}

Кроме того, ваш внутренний код должен также использовать StringBuilder вместо '& ='.Я обнаружил, что строка добавляет огромный удар по производительности.

...