Вызов asmx с массивом классов из jQuery ajax - PullRequest
1 голос
/ 18 августа 2011

У меня есть WebMethod со следующей подписью:

[WebMethod]
    public void SaveRoute(int id, Coordinates[] coordinates)
    {
    }

Где координаты:

/// <summary>
/// A position on the globe
/// </summary>
public class Coordinates
{
    public decimal Longitude { get; protected set; }
    public decimal Latitude { get; protected set; }

    public Coordinates(decimal latitude, decimal longitude)
    {
        this.Longitude = longitude;
        this.Latitude = latitude;
    }
}

Я хочу вызвать это из метода jQuery ajax, подобного этому:

$.ajax({
                    type: "POST",
                    url: "Routes.asmx/SaveRoute",
                    cache: false,
                    contentType: "application/json; charset=utf-8",
                    data: '{"id":1, ,"coordinates": "Longitude":123,"Latitude":456}',
                    dataType: "json",
                    success: handleHtml,
                    error: ajaxFailed
                });

Что бы я мог предоставить в свойстве data для правильной десериализации?

Теперь я решил это:

Спасибо за помощь, мне в итоге удалосьполучить то, что я хотел, с помощью следующего кода:

var coords = new Array();
            for (ckey in flightPlanCoordinates) {
                var thisWaypoint = { "Longitude": flightPlanCoordinates[ckey].lng(), "Latitude": flightPlanCoordinates[ckey].lat() };
                coords.push(thisWaypoint);
            }
            var data = { "id": 1, "coordinates": coords };
            if (flightPlanCoordinates) {

                $.ajax({
                    type: "POST",
                    url: "Routes.asmx/SaveRoute",
                    cache: false,
                    contentType: "application/json; charset=utf-8",
                    data: JSON.stringify(data),
                    dataType: "json",
                    success: handleHtml,
                    error: ajaxFailed
                });
            }

Я реверс-инжиниринг JSON, отправив некоторые с другим методом:

[WebMethod]
    public Coordinates[] Get()
    {
        return new Coordinates[]
        {
            new Coordinates(123, 456),
            new Coordinates(789, 741)
        };
    }

Также важно, чтобы у вас был публичный без параметровКонструктор в вашем классе и сеттеры вашей собственности общедоступны:

/// <summary>
/// A position on the globe
/// </summary>
public class Coordinates
{
    public decimal Longitude { get; set; }
    public decimal Latitude { get; set; }

    public Coordinates()
    {
    }

    public Coordinates(decimal latitude, decimal longitude)
    {
        this.Longitude = longitude;
        this.Latitude = latitude;
    }
}

Ответы [ 3 ]

2 голосов
/ 18 августа 2011

Я рекомендую использовать JSON.stringify для построения ваших строк "JSON". С помощью JSON.stringify вы можете преобразовать массив координат в строковое представление JSON. Пример:

var id = 2;
var coords = new Array();

coords[0] = { Longitude: 40.0, Latitude: 76.0 };
coords[1] = { Longitude: 42.0, Latitude: 77.0 };

$.ajax({
    type: "POST",
    url: "Routes.asmx/SaveRoute",
    cache: false,
    contentType: "application/json; charset=utf-8",
    data: '{ "id":' + JSON.stringify(id) + ', "coordinates":' + JSON.stringify(coords) + '}',
    dataType: "json",
    success: handleHtml,
    error: ajaxFailed });

Если вы разместите свой веб-метод SaveRoute на веб-сайте aspx, вы можете использовать ScriptManager для генерации методы страницы и типы сценариев (см. документацию MSDN для GenerateScriptTypeAttribute).

1 голос
/ 18 августа 2011

Предоставить его как объект, а не строку:

$.ajax({
    type: "POST",
    url: "Routes.asmx/SaveRoute",
    cache: false,
    contentType: "application/json; charset=utf-8",
    data: {"id":1, "coordinates": ["Longitude":123, "Latitude":456]},
    dataType: "json",
    success: handleHtml,
    error: ajaxFailed
});
0 голосов
/ 18 августа 2011

Так как coordinates является массивом, попробуйте это

data: '{ "id":1, ,"coordinates": [ {"Longitude":123,"Latitude":456} ] }'

. Для более сложных объектов вы можете использовать JSON связыватель по ссылке ниже

http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2009/08/10/mvc-custom-json-binder.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...