Как вы моделируете изменения формы под Spring MVC? - PullRequest
1 голос
/ 14 января 2010

Пожалуйста, держитесь за меня, когда я пытаюсь абстрагироваться от этой проблемы.

Допустим, вы пишете веб-страницу для продавцов фруктов, используя SimpleFormController от Spring MVC , версия 2.5.6. На этой странице продавец может сделать простые вещи, такие как изменить свое имя или адрес. Они также могут изменить свой инвентарь на основе выпадающего списка, заполненного существующим выбором инвентаря.

Когда этот выбор в раскрывающемся списке изменяется, вся форма изменяется в соответствии с перечнем того, что было выбрано. Таким образом, в одном ассортименте могут быть бананы и груши, в другом - дыни, черника и грейпфрут. Image to demonstrate what I am talking about.

Внутри каждого инвентарного списка есть поле ввода, которое необходимо распространить обратно в базу данных, для примера рассмотрим, что пользователь вводит количество фруктов.

Способ, которым это моделируется в базе данных, заключается в том, что каждое название запаса хранится в таблице, которая имеет отношение один ко многим с содержимым каждого запаса, который в данном примере будет типом фруктов. Тогда тип фруктов имеет отношение один ко многим с количеством, которое выбирает продавец. Название запаса и тип фруктов в каждом запасе хранятся в базе данных и не могут быть изменены пользователем, а таблица количества подключенных плодов может быть отредактирована.

У меня вопрос, как вы моделируете форму, описанную выше в Spring MVC?

Я попытался переопределить isFormChangeRequest и onFormChange , чтобы упростить изменение формы, но я думаю, что, возможно, неправильно понял назначение этих методов. Когда я изменяю свой объект команды поддержки в следующий раз, когда страница публикуется, он пытается привязать запрос к форме, что прерывается, если вы измените размер массива Stock (скажем, от 3 до 2, он попытается привязать к 3-му значение, даже если оно пустое).

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 27 января 2010

Я закончил тем, что запустил событие JavaScript, когда выбор в раскрывающемся списке изменился. Этот JavaScript (см. Ниже) генерирует URL на основе выбора раскрывающегося списка и использует location.replace для перехода на новый URL, что заставляет контроллер генерировать новую форму.

Использование этого метода с переопределением isFormChangeRequest и onFormChange позволило мне избежать ошибок привязки, вызванных перенесенными данными.

function changeUrl(selectionValue) {
    var param = getParams();
    param["dropdownselection"] = selectionValue;
    window.location.replace(getBaseUrl() + buildQueryString(param));
}

//taken from http://javascript.about.com/library/blqs1.htm
function getParams() {
    var qsParm = new Array();
    var query = window.location.search.substring(1);
    var parms = query.split('&');
    for (var i = 0; i < parms.length; i++) {
        var pos = parms[i].indexOf('=');
        if (pos > 0) {
            var key = parms[i].substring(0,pos);
            var val = parms[i].substring(pos+1);
            qsParm[key] = val;
        }
    }
    return qsParm;
}

function getBaseUrl() {
    var url = document.location.toString();
    if (url.indexOf('?') != -1) {
        url = url.substring(0, url.indexOf('?'));
    }
    return url;
}

function buildQueryString(param) {
    var queryString = "?";
    for (var key in param) {
        queryString += key + "=" + param[key] + "&";
    }
    //remove last "&"
    return queryString.substring(0,queryString.length - 1);
}
0 голосов
/ 14 января 2010

Если у вас ограниченное количество разных акций, вы можете использовать разные сопоставления обработчиков для каждого с другой моделью поддержки:

@ RequestMapping (PARAMS = "запас = example1") ModelAndView handleExample1 (@ModelAttribute ("stock") ЯблокиOrangesPears stockObject)

@ RequestMapping (PARAMS = "запас = example2") ModelAndView handleExample2 (@ModelAttribute ("stock") БананыPotatos stockObject)

Но я думаю, что это не так, есть много разных типов акций, и они динамичны. В этом случае вы можете зарегистрировать редактор пользовательских свойств (@InitBinder) и динамически определить фактический тип объекта поддержки для инвентаризации, а затем проверить и явно преобразовать в него или из него.

...