Как передать строку в веб-сервис asp.net, используя jQuery / JSON / AJAX - PullRequest
2 голосов
/ 29 октября 2010

Как сейчас, я создаю объект JavaScript, а затем преобразую его в строку, помещаю в скрытое текстовое поле, и мой код может прочитать эту строку. Затем я использую JSON.NET для разбора строки, которая работает нормально. Сейчас я пытаюсь использовать ajax, чтобы опубликовать его в своем веб-сервисе, но у меня возникают проблемы с отправкой строки. Я пробовал много способов, но получаю типичные ошибки, такие как

Invalid JSON primitive: myString.

Итак, я проверил это http://encosia.com/2010/05/31/asmx-scriptservice-mistake-invalid-json-primitive/, и оно работает с жестко закодированными значениями, но я хочу использовать переменную.

JavaScsript для создания объекта:

for (var i = 0; i < results.rows.length; i++) {
        var row = results.rows.item(i);
    var customer = new Object();

        customer.id = row['id']
        customer.name = row['name']

    var customerString = JSON.stringify(customer);

    $.ajax({
        type: "POST",
        url: "synchronise.asmx/synchroniseCustomers",
        data: "synchroniseCustomers: " + customerString,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
                    error: function (xhr, status) {
                alert("An error occurred: " + status);
            },
        success: function (msg) {
            alert("success");
        }
    });
}

WebMethod:

 public void synchroniseCustomers(string customerString)
        {
            JObject o = JObject.Parse(customerString);
            string id = (string)o["id"];
            string name = (string)o["name"];

Если я использую data: '{ FirstName: "Dave", LastName: "Ward" }' в приведенном выше примере это работает, но вместо этого я хочу передать строку.

Есть предложения?

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Вы довольно близки, но вам нужно отправить это так:

data: '{"synchroniseCustomers": ' + customerString + '}'

Кроме того, нет необходимости принимать его как строку и десериализовать JSON вручную на стороне .NET. .NET будет обрабатывать все это автоматически, если вы объявите тип ввода как соответствующую структуру на стороне сервера.

Это должно помочь с тем, что вы пытаетесь сделать там: http://encosia.com/2009/04/07/using-complex-types-to-make-calling-services-less-complex/

0 голосов
/ 29 октября 2010

Ваш параметр данных должен быть заключен в {}, если вы передаете json, и ваш веб-метод должен быть видим в скрипте, добавив декоратор.Взгляните на эту запись в блоге Я писал некоторое время назад - у нее есть пример.Я также нашел эту статью полезной.

Атрибут, который вы должны добавить в свой класс asmx, равен [System.Web.Script.Services.ScriptService], и вам нужно будет добавить [System.Web.Script.Services.ScriptMethod] в свой веб-метод, если вы этого еще не сделали.

... кстати, вы передаете строку;это просто в формате JSON.Если вы хотите использовать механизм передачи параметров, отличный от json, вы можете оставить contentType вне своего вызова и передать свои параметры, как показано ниже, хотя вам нужно будет убедиться, что ваш asmx будет нормально анализировать параметры (MVC не имеет никаких сомнений:)

data:"FirstName=David&LastName=Ward"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...