использование jquery/ajax/webmethod для обновления списка

у меня есть список, который я хочу обновить, используя jquery/ajax для вызова веб-метода со страницы кода. в списке отображаются все пользователи, которые вошли в систему (они добавляются в глобальный список при успешном входе в систему). я, очевидно, могу обновить список, используя полное обновление страницы, но это не эстетично. у меня две проблемы.

  1. когда я запускаю приложение в Chrome и проверяю сетевую активность с помощью инструментов разработчика, я не вижу вызываемого веб-метода. у меня есть другие веб-методы, которые (я вижу) запускаются/выполняются, как и ожидалось.

  2. я написал скрипт на основе найденного примера, поэтому я не совсем уверен (я относительно новичок в этих областях), если я (а) правильно получаю данные из списка (я просто хочу, чтобы имя пользователя отображалось ) и (b) правильное добавление его в список.

вот веб-метод:

[WebMethod()]
    public static string[] getCurrentList()
    {
        int count = 0; 
        for(int i = 0; i < Global.ListUsers.Count(); i++)
            count++;

        string[] results = new string[count];

        for (int i = 0; i < count; i++)
        {
            results[i] = Global.ListUsers[i].Username.ToString();**//edited...** 
        }                                            

        return results;
    }

и сценарий:

$(function updateListbox() {
var lBox = $('select[id$=ListBox1]');
setInterval(function () {
    $.ajax({
        beforeSend: function (req) {
            req.setRequestHeader("Accept", "application/json");
        },
        type: "POST",
        url: "Homepage.aspx/getCurrentList",
        data: "json=" + JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            var results = data.d;
            if (results.length > 0) {
                var updatedList = [];
                for (var i in results) {
                    updatedList.push(results[i]);
                }
                $(lBox).append(updatedList.join('\n'));
            }
            else alert("No new items to update...");
        }
    });
}, 5000);

});

вся помощь и предложения приветствуются и ценятся


person MattSull    schedule 03.04.2012    source источник


Ответы (2)


Вам ничего не нужно в поле данных, если вы не передаете параметры в функцию. Просто оставьте это поле пустым, и все должно работать нормально.

Мне также никогда не приходилось использовать параметр beforeSend, но ваш сценарий может немного отличаться.

person servarevitas3    schedule 03.04.2012
comment
спасибо, что прояснили это, я на самом деле не знал, для чего предназначено поле данных. однако причина, по которой у меня есть это в поле данных, заключается в том, что я получал ошибку сервера 500 от инструментов разработчика в chrome, и после поиска это было решение, которое я нашел - оно остановило ошибку, но я не вижу webmethod вызывается, как указано выше. у меня есть еще один веб-метод queryInvitedBy, который, как я вижу, вызывается каждые 5 секунд (как и ожидалось), поэтому я не понимаю, почему я не вижу вызова getCurrentList. - person MattSull; 03.04.2012
comment
я удалил то, что находится в поле данных; теперь я вижу, как срабатывает веб-метод, но я снова получаю эту ошибку: 500 внутренняя ошибка сервера. Если я просмотрю предварительный просмотр/ответ на запрос, я увижу: Ссылка на объект не указывает на экземпляр объекта. - person MattSull; 03.04.2012
comment
Пройдитесь по коду C#, чтобы увидеть, что именно вызывает исключение. В вашем первом цикле for отсутствуют скобки... - person servarevitas3; 03.04.2012
comment
отдельные строки кода после операторов могут быть встроенными, со скобками или без них. я вставлю трассировку стека ниже, так как в этом комментарии недостаточно места. - person MattSull; 03.04.2012
comment
{Ссылка на объект не указывает на экземпляр объекта., StackTrace: в System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters (параметры IDictionary2 rawParams)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary2)\r\n в System.Web.Script.Services.RestHandler.InvokeMethod (контекст HttpContext , WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(контекст HttpContext, WebServiceMethodData methodData),ExceptionType:System.NullReferenceException} - person MattSull; 03.04.2012
comment
Хорошо, я просто не был уверен, что именно должно было содержаться в первом цикле for. - person servarevitas3; 03.04.2012
comment
Для части данных вы должны иметь возможность использовать data: "{}" - прочитайте encosia.com/ - person RemarkLima; 04.04.2012

На самом деле проблема заключается в данных свойства вызова AJAX. Измените свойство данных следующим образом:

data: "{}",

Никаких параметров отправлять не нужно ("json=" + JSON.stringify(data). Ваш веб-метод не содержит никаких параметров). Также, согласно ответу servarevitas, параметр beforeSend не требуется, поскольку вызов ajax уже указал тип контента как Json.

person mas_oz2k1    schedule 29.11.2013