Автозаполнение jQuery с C # и базой данных SQL Server - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь использовать автозаполнение jQuery для моих динамически создаваемых текстовых полей. я впервые работаю с jQuery, так что я не уверен, где я ухожу ... Мой код страницы ASMX работает нормально и генерирует результат в соответствии с запросом, но мой JavaScript автозаполнение не вызывает страницу вообще (пробовал в отладке) и не выдает ошибку сообщение либо ... Помогите пожалуйста !!

РЕДАКТИРОВАТЬ: У меня по-прежнему возникает ошибка «Не удалось загрузить клиентскую среду ASP.NET Ajax».

<script src="/ScriptResource.axd?d=dRAn80ZulnXIbHUFZAi0thqEaFFdeMlwAh6uA_ciIINTs7jTUe13ADvaDyjOl6tPSr-1TN4Bqt6MFVjznyiXABGNxDhFk5_-02EGxOku0B-Tim4ebG59zhvC6DdsHV11uoIY024U1o0IMngrTBO45x9tPeG-PiyEUPEypUFf795T-3SY0&amp;t=ffffffffb868b5f4" type="text/javascript"></script>
<script type="text/javascript">
<!--
if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax client-side framework failed to load.'); 

При вводе в текстовое поле появляется всплывающая ошибка:

Ошибка Ajax: исследовательский список.asmx / FetchResList: ошибка: не определено: Внутренняя ошибка сервера: 500

РЕДАКТИРОВАННЫЙ КОД:

Код Aspx:

$(function() {
    $('input:text').autocomplete({
        source: function(request, response) {
            var pString = '{ "resName": "' + request.term + '" }';
            $.ajax({
                url: "researcher_list.asmx/FetchResList", /* same root as the page? */
                data: pString,
                dataType: "jsond",
                type: "POST",
                contentType: "application/json", /* simplify */
                converters: {/* avoid the d or no d issue, works with 3.5 or prior this way */
                    "json jsond": function(msg) {
                        return msg.hasOwnProperty('d') ? msg.d : msg;
                    }
                },
                success: function(data) {/* assumes data always returned and it IS called item in the JSON */
                    response($.map(data, function(item) {
                        return {
                            value: item.name,
                            label: item.name
                        }
                    }))
                },
                error: function(xhr, textStatus, errorThrown) {
                    var errorMessage = "Ajax error: " + this.url + " : " + textStatus + " : " + errorThrown + " : " + xhr.statusText + " : " + xhr.status;

                    if (xhr.status != "0" || errorThrown != "abort") {
                        alert(errorMessage);
                    }
                }
            });
        },
        minLength: 2
    });
});

Код Asmx:

[WebService(Namespace = "http://localhost/v2/pages/main.aspx")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService]
public class researcher_list : System.Web.Services.WebService
{
    [WebMethod]
    public List<DBResearcher.Summary> FetchResList(string resName)
    {
        //SqlConnection connection;
        //SqlCommand command = null;
        //SqlDataReader myReader = null;
        //string sql;
        //StringBuilder sb = new StringBuilder();
        var tempSum = new DBResearcher();
        var allRes = DBResearcher.GetAllResearcher()
                        .Where(m => m.name.ToLower().Contains(resName.ToLower()));
        return allRes.ToList();
    }

    public static string[] GetCustomerNames()
    {
        string[] data = new string[] { "Andrew", "Ramona", "Russ", "Russell",  Raymond" };

        return data;

    }
}

Файл web.config:

<httpHandlers>
  <!-- AJAX.Net Configuration -->
  <add verb="GET,POST" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax"/>
  <remove verb="*" path="*.asmx"/>
  <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpHandlers>

<!-- HTTP MODULES -->

 <httpModules>
  <!-- doesn't work if we restrict it by <location path=...> for some reason,
            so we have no choice but to do this at the root level. -->
  <!--<add name="HttpUploadModule" type="AssistedSolutions.SlickUpload.HttpUploadModule, AssistedSolutions.SlickUpload" />
    -->
  <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

 </httpModules>

РЕДАКТИРОВАТЬ - Ошибка при самостоятельном запуске страницы asmx

Stack Trace:

[HttpException (0x80004005): Failed to Execute URL.]
   System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.BeginExecuteUrl(String url, String method, String childHeaders, Boolean sendHeaders, Boolean addUserIndo, IntPtr token, String name, String authType, Byte[] entity, AsyncCallback cb, Object state) +2008569
   System.Web.HttpResponse.BeginExecuteUrlForEntireResponse(String pathOverride, NameValueCollection requestHeaders, AsyncCallback cb, Object state) +393
   System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) +220
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8699714
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Ответы [ 2 ]

1 голос
/ 24 января 2012

Мой ответ построен на основе решения asp.net 3.5 и предположения о версии jQuery 1.7.1.Многое уже освещалось другими постерами.Ваш может отличаться в зависимости от версии.Это просто попытка поместить комментарии в ответ с законченным сценарием и примечаниями на стороне сервера.

Вы украсили свой класс таким образом:

[WebService(Namespace = "http://mysite.com/researcher_list/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class researcher_list : WebService
{

Украсьте свой метод: (используйте EnableSessionЕсли вам это нужно ...)

[WebMethod(EnableSession = true)]
public List<DBResearcher.Summary> FetchResList(string resName)        {  

очистка клиентского скрипта:

$('input:text').autocomplete({
    source: function(request, response) {
        var pString = '{ "resName": "' + request.term + '" }';
        $.ajax({
            url: "researcher_list.asmx/FetchResList",
            /* same root as the page? */
            data: pString,
            dataType: "jsond",
            type: "POST",
            contentType: "application/json",
            /* simplify */
            converters: { /* avoid the d or no d issue, works with 3.5 or prior this way */
                "json jsond": function(msg) {
                    return msg.hasOwnProperty('d') ? msg.d : msg;
                }
            },
            success: function(data) { /* assumes data always returned and it IS called item in the JSON */
                response($.map(data, function(item) {
                    return {
                        value: item.name,
                        label: item.name
                    };
                }));
            },
            minLength: 2,
            error: function(xhr, textStatus, errorThrown) {
                var errorMessage = "Ajax error: " + this.url + " : " + textStatus + " : " + errorThrown + " : " + xhr.statusText + " : " + xhr.status;
                if (xhr.status != "0" || errorThrown != "abort") {
                    alert(errorMessage);
                }
            }
        });
    }
});

В дополнение к вышесказанному, в asp.net есть настройки Web.config, которые необходимоустановить, чтобы веб-сервис функционировал - предполагается, что вы провели исследование и работаете.Если НЕ, то предложите создать простой метод, который возвращает текущее время в виде строки с параметрами NO (data: "{}",) и получает это через ajax, чтобы убедиться, что оно работает до того, как сложность автозаполнения будет наслоена.

1 голос
/ 24 января 2012

Попробуйте пометить ваш метод с помощью атрибута WebMethod следующим образом:

[WebMethod]
public static List<DBResearcher.Summary> FetchResList(string mail)
{
...
}

Кроме того, ваши параметры должны совпадать, поэтому измените resName на mail.

Вы также можете объединить свой jQuery с селектором автозаполнения:

$('input:text').autocomplete(...)

Edit:

Попробуйте этот код:

$('input:text').autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "researcher_list.asmx/FetchResList",
            data: "{ 'resName': '" + request.term + "' }",
            dataType: "json",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataFilter: function (data) { return data; },
            success: function (data) {
                response($.map(data.d, function (item) {
                    return {
                        value: item.name
                    }
                }))
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(textStatus);
            }
        });
    }, minLength: 2
});
...