Grails 2.5.0 — командный объект обрабатывает POST-запрос с помощью JSON

У меня есть форма, настроенная для отправки запроса POST контроллеру Grails, который использует объект Command в качестве единственного параметра. Командный объект содержит корректную привязку некоторых свойств вместе со списком элементов, который не привязывается корректно. Что я делаю, так это обычно отправляю другие параметры через запрос POST, но оборачиваю список в виде строки JSON, так как я не уверен в другом способе отправки списка через POST (помимо, скажем, строки XML) . Каков последний шаг в том, чтобы заставить объект команды правильно связать список со строкой, или есть лучший способ отправить список объекту команды?

Изменить: вот упрощенная версия:

Проверка URI:

request.forwardURI = 'list1=[{"listprop1":"a","listprop2":"b"}]&prop1=c&prop2=d'

Объекты команды:

class MyListCommand {
    String listprop1
    String listprop2

    static constraints = {
        listprop1 nullable: true
        listprop2 nullable: true
    }
}

class MyCommand {
    List<MyListCommand> list1 = [].withLazyDefault {
        new MyListCommand('[]')
    }
    String prop1
    String prop2

    static constraints = {
        prop1 nullable: true
        prop2 nullable: true
    }
}

Форма:

<form action="${createLink(action: 'myAction')}" method="post">
                <div ng-repeat="list1 in list1array">
                    <input type="hidden" name="list1[{{ $index }}].listprop1" value="{{list1.listprop1}}"/>
                    <input type="hidden" name="list1[{{ $index }}].listprop2" value="{{list1.listprop2}}"/>
                </div>
                <input name="prop1" type="text">
                <input name="prop2" type="text">
            </form>

person Anonymous1    schedule 27.09.2015    source источник
comment
Вам нужно включить объект команды, а также вашу форму (или то, как вы составляете данные, которые вы публикуете), чтобы кто-нибудь мог дать вам хороший ответ о том, как к этому подойти.   -  person Joshua Moore    schedule 27.09.2015
comment
Я добавил соответствующую информацию. Вместо этого я вставил forwardURI (который я упростил из Fiddler).   -  person Anonymous1    schedule 27.09.2015


Ответы (1)


Попробуйте отправить запрос следующим образом:

request.forwardURI = 'list1[0].listprop1=a&list1[0].listprop2=b&prop1=c&prop2=d'

Даже лучше

Лучше использовать Ajax с g:remoteForm тег.

person Emmanuel Rosa    schedule 27.09.2015
comment
Форма кодирует его как list1%5B0%5D.listprop1=a&list1%5B0%5D.listprop2=b&prop1=c&prop2=d, когда я вижу его в Fiddler. Это проблема? Я получаю сообщение об ошибке. Свойство [list1] класса [class com.mypackage.MyCommand] не может быть нулевым - person Anonymous1; 27.09.2015
comment
Я добавил код. Обратите внимание, что AngularJS заполняет list1array. Мне жаль, что имена в этом упрощенном коде выглядят нелепо. - person Anonymous1; 28.09.2015
comment
Ах, вы не используете <g:form>. Поскольку вы хотите использовать ajax, попробуйте вместо этого удаленную форму: grails.github.io/grails-doc/2.5.0/guide/ - person Emmanuel Rosa; 28.09.2015
comment
Я на самом деле не хочу использовать ajax. Я просто хочу отправить форму по почте в обычном режиме. Когда я попробовал ‹g:form›, я получил точно такие же результаты на Fiddler. - person Anonymous1; 28.09.2015
comment
В итоге я использовал AJAX, как вы предложили, и заставил его работать таким образом, если вы хотите поместить это как отдельный ответ. - person Anonymous1; 30.09.2015