Сериализовать массив JavaScript

Я использую расширенную сетку додзё, а переменная с пометкой "myGrid" относится к сетке.

function addtocart() {
        $("#additem").click(function(){
            var myGrid = dojo.byId(dataGrid);
            var ids = [];
            var gridRow = myGrid.selection.getSelected();
            $.each( gridRow, function(i, l){
                ids.push(l.id);
            });
            var registcarturl = "${carturl}" + $("#regCart :selected").val();
            $.get(registcarturl, {instanceIds: ids}, function(data) {
                alert(data);
            });
        });
    }

Я не уверен, как должна выглядеть строка для сериализованного массива, поскольку я могу динамически построить любую строку. Я пытаюсь использовать метод get jquery, как показано в примере

$.get("test.cgi", { name: "John", time: "2pm" },   function(data){     alert("Data Loaded: " + data);   });

Я изменил функцию следующим образом

    function addtocart() {
        $("#additem").click(function(){
            var myGrid = dojo.byId(dataGrid);
            var ids = "[";
            var gridRow = myGrid.selection.getSelected();
            $.each( gridRow, function(i, l){
                ids = ids + "\"" +l.id +"\"";

                if(i != (gridRow.length -1)){
                    ids = ids + ",";
                };

            });
            ids = ids + "]";
            alert(ids);
            var registcarturl = "${carturl}" + $("#regCart :selected").val();
            $.get(registcarturl, {instanceIds: ids}, function(data) {
                alert(data);
            });
        });
    }

Когда мои данные попадают в мой контроллер Java, он пытается обработать ["219" как длинный и, конечно, результат NumberFormatException. Переменная id javascript выглядит следующим образом ["219","217","218","195"]

Может кто-нибудь, пожалуйста, предложить некоторые рекомендации.

3 ответа

Решение

Итак, решение было очень очень простым. Вот.

    function addtocart() {
        $("#additem").click(function(){
            var myGrid = dojo.byId(dataGrid);
            var ids = [];
            var gridRow = myGrid.selection.getSelected();
            $.each( gridRow, function(i, l){
                ids[i] = l.id;
            });
            var registcarturl = "${carturl}" + $("#regCart :selected").val();
            $.get(registcarturl, {"modinstid[]": ids}, function(data) {
                alert(data);
            });
        });
    }

Посмотрите запрос на получение {"modinstid[]": ids} и соответствующий пружинный контроллер MVC работает следующим образом.

@RequestMapping(value = "addtocart/{cart}", method = RequestMethod.GET) public @ResponseBody
String addtocart(@PathVariable("cart") Long cart, @RequestParam("modinstid[]") ArrayList<String> instances, Model uiModel) {...Action logic goes here...}

Посмотрите на свойство @RequestParam аргументов действия

Вы можете использовать JSON-js для сериализации любого объекта JavaScript или массива в JSON.

Просто создайте массив идентификаторов, которые вы передаете $.get() метод:

function addtocart() {
    $("#additem").click(function(){
        var myGrid = dojo.byId(dataGrid);
        var ids = [];
        var gridRow = myGrid.selection.getSelected();
        $.each( gridRow, function(i, l){
            ids[ids.length] = l.id;
        });
        alert(ids);
        var registcarturl = "${carturl}" + $("#regCart :selected").val();
        $.get(registcarturl, {instanceIds: ids}, function(data) {
            alert(data);
        });
    });
}

Обратите внимание, что для добавления другого индекса в массив, который я использовал ids[ids.length] вместо .push, .push работает быстрее в новых браузерах, но прежний метод работает быстрее в старых браузерах.

Другие вопросы по тегам