Вызов веб-метода, который возвращает не строковое значение AJAX [ASP.net] - PullRequest
0 голосов
/ 19 февраля 2012

я сделал веб-функцию в файле C # с именем test, она возвращает простой список для тестирования

[WebMethod(EnableSession = false)]
public static List<string> test()
{
    List<string> a = new List <string>() ; 
    a.Add("1s");
    a.Add("2s");
    return a; 
}

Я пытался вызвать это WEBMETHOD из внешнего интерфейса, используя JQUERY AJAX

     function Test() {

            $.ajax({
                type: "POST",
                url: "Default.aspx/test",
                data: "",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                    x = msg;
                    $(".resultbox").html(msg.d);
                }
            });

            return x;

}

когда я вызываю test (); из консоли появилось сообщение:

Uncaught Error: NOT_FOUND_ERR: DOM Exception 8   jquery-1.6.1.min.js:18

в общих случаях я конвертирую объекты в JSON и возвращаю их, и это обычно работает, но мне интересно знать, как объекты возвращаются из WEBMETHOD во внешний интерфейс, сериализуются ли они в текст, почему произошла эта ошибка.

Ответы [ 3 ]

1 голос
/ 19 февраля 2012

Попробуйте это.

function Test() {

    $.ajax({
        type: "POST",
        url: "Default.aspx/test",
        data: "",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            msg = msg.hasOwnProperty("d") ? msg.d : msg;
            $.each(msg, function (index, value) {
                $(".resultbox").append("<p>" + value + "</p>");
            });
        }
    });

}
1 голос
/ 19 февраля 2012

Я считаю, что исключение DOM связано с передачей объекта массива в innerHTML() с помощью метода jQuery html(). Попробуйте вместо этого сначала отформатировать значения массива в виде строки:

success: function (msg) {
  // Builds a string like '1s, 2s'
  var formattedMessage = msg.d.join(', ');

  $(".resultbox").html(formattedMessage);
}

Ручная сборка отформатированной строки, конечно, неинтересна. Чтобы улучшить эту ситуацию, посмотрите на клиентские шаблоныные решения, такие как jQuery Templates и его преемник JsRender.

0 голосов
/ 19 февраля 2012

Поскольку вы отправляете список строк из WebMethod, то msg будет массивом.В этом случае msg.d даст вам undefined результат.Если вы хотите показать их как объединенную строку, разделенную запятой, попробуйте это.

ajax по своей природе асинхронный по умолчанию, вы не можете вернуть ответ ajax из метода Test.Если вы хотите вернуть его, установите async на false, который будет ждать ответа, а затем вы можете вернуть его.

function Test() {
            var x = null;//Define variable x
            $.ajax({
                type: "POST",
                async: false,
                url: "webservice.asmx/test",//Web service url
                data: "",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                    x = msg;
                    $(".resultbox").html(msg.join(','));
                }
            });

            return x;
}
...