Вызов jQuery AJAX для ASP.NET Веб — метод

#c# #jquery #ajax #webmethod

#c# #jquery #ajax #веб-метод

Вопрос:

У меня есть следующий запрос jQuery AJAX:

 function sendUpdate(urlToSend) {
    var code = AccessCode; 
    var url = urlToSend;
    var options = { error: function(msg) { alert(msg.d); },
                    type: "POST", url: "webmethods.aspx/UpdatePage",
                    data: "{ accessCode: "   code   ", newURL: '"   url   "' }",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    async: true, 
                    success: function(response) { var results = response.d; } }; 
    $.ajax(options);
}
  

И соответствующий ASP.NET Веб — метод:

 [WebMethod]
public static bool UpdatePage(string accessCode, string newURL)
{
    bool result = true;
    try
    {
        HttpContext.Current.Cache[accessCode   "l"] = newURL;
    }
    catch
    {
        result = false;
    }

    return resu<
}
  

Все это использовалось для корректной работы с «async: false», однако я должен избавиться от него, поскольку он замораживает браузер до получения ответа. Теперь приведенный выше AJAX-запрос возвращает «undefined».

Кто-нибудь может сказать мне, почему это происходит и в чем проблема?

Спасибо.

Комментарии:

1. Что не определено, «ответ» или «response.d»? Вы должны посмотреть, что такое объект полного ответа, чтобы увидеть, выдает ли он вам какие-либо сообщения об ошибках с сервера.

Ответ №1:

Вы действительно должны убедиться, что правильно закодировали этот JSON. JSON.stringify является наиболее надежным методом:

 data: JSON.stringify({ accessCode: code, newURL: url })
  

Это гарантирует, что даже если переменные code and url содержат некоторые опасные символы, которые нарушат ваши конкатенации строк в результирующем JSON, в конце все будет правильно закодировано. Метод JSON.stringify изначально встроен в современные браузеры, но если вам нужно поддерживать устаревшие, вы можете включить json2.js .

Кроме того, поскольку ваш код больше не блокируется, вы должны убедиться, что если вы вызываете это sendUpdate с помощью какого-либо нажатия кнопки или отправки формы, вы отменяете действие по умолчанию, возвращая false .

Ответ №2:

Мой способ работает правильно:

 [System.Web.Services.WebMethod()] 

        public static string getHello(string str)
        {
            //do some things with str   
            return str;
        }
  

В file .js я определяю эту функцию для вызова webmethod в file .cs:

 function CallServerFunction(StrPriUrl, ObjPriData, CallBackFunction) {

    $.ajax({
        type: "post",
        url: StrPriUrl,
        contentType: "application/json; charset=utf-8",
        data: ObjPriData,
        dataType: "json",
        success: function (result) {
            if (CallBackFunction != null amp;amp; typeof CallBackFunction != 'undefined') {
                CallBackFunction(result);
            }

        },
        error: function (result) {
            alert('error occured');
            alert(result.responseText);
            window.location.href = "FrmError.aspx?Exception="   result.responseText;
        },
        async: true
    });
}
  

Затем вызовите use (вызов в file.js ):

  var text = $("#textbox_send").val();

    var myresu<
    CallServerFunction("Default.aspx/getHello", JSON.stringify({ str: text }), function (myresult) {
        if (text != "")
            $('#'   id).append('<p>'   $("#account_user").text()   ': '   myresult.d   '</p>');
    });
  

Ответ №3:

«Неопределенный» может быть результатом ошибки сервера.Если вы используете Firebug, Firefox (или любой хороший инструмент отладки клиента), вы можете найти ошибку, возвращенную сервером. Вставьте ошибку, если таковая имеется.

Тем не менее, я также отметил, что «данные» для «accessCode» неправильно заключены в кавычки ‘ ’

Исправленный параметр данных будет :

 data: "{ accessCode: '"   code   "', newURL: '"   url   "' }",
  

PS:
Поскольку «параметры» имеют другое значение в Jquery, я бы рекомендовал изменить имя переменной на «setting» . Измените «параметры var» на «настройки var». 🙂