отображение ошибок в Grails без обновления страницы - PullRequest
0 голосов
/ 19 января 2012

У меня есть страница с динамическими списками (выбор значения из первого списка заполняет значения во втором списке).

Ошибки проверки для списков работают нормально, но при отображении сообщений об ошибках страница обновляется, а выбранные значения устанавливаются в исходное состояние (необходимо снова выбрать значения в списках)

Страница предназначена для добавления любого количества списков с помощью вызовов ajax, поэтому добавление и выбор значений снова будет переделкой.

Не могли бы вы помочь мне отобразить ошибки проверки и сохранить выбранные значения такими, какие они есть (ранее я сталкивался с аналогичной ситуацией, которая была разрешена путем замены локальных переменных preprocess и postprocess глобальной переменной, на этот раз не повезло с таким подходом )

Любые намеки / помощь будут великолепны

static constraints = {
        deviceMapping(
                validator: {val, obj ->
                    Properties dm = (Properties) val;
                    def deviceCheck = [:];
                    if (obj.customErrorMessage == null) {
                        for (def device : dm) {
                            if (device.key == null || "null".equalsIgnoreCase(device.key)) {
                                return ["notSelected"];
                            }
                            deviceCheck.put(device.key, "");
                        }

                        if (deviceCheck.size() != obj.properties["numberOfDevices"]) {
                            return ["multipleDevicesError"];
                        }
                    }
                }
        )
        customErrorMessage (
                validator: {
                    if ("sameDeviceMultipleTimes".equals(it)) {
                        return ['sameDeviceMultipleTimes']
                    }

                }
        )
    }
    public LinkedHashMap<String, Object> preProcess(sessionObject, params, request) {
        Submission submission = (Submission) sessionObject;
        def selectedFileName = sessionObject.fileName;
        logger.debug("submission.deviceMapping :"+submission.deviceMapping)
        try {
            Customer customer = Customer.get(submission.customerId);
            OperatingSystem operatingSystem = OperatingSystem.get(submission.operatingSystemId)
            def ftpClientService = new FtpClientService();
            def files = ftpClientService.listFilesInZip(customer.ftpUser, customer.ftpPassword, customer.ftpHost, customer.ftpToPackageDirectory, selectedFileName, operatingSystem, customer.ftpCustomerTempDirectory);
            def terminalService = new TerminalService();

            OperatingSystem os = OperatingSystem.get(submission.getOperatingSystemId());
            def manufacturers = terminalService.getAllDeviceManufacturersForType(os.getType());
            logger.debug("manufacturers after os type :"+manufacturers)
            logger.debug("files in preprocess :"+files)

            def devicesForFiles = [:]
            files.each { file ->
               def devicesForThisFile = [];
               submission.deviceMapping.each { device ->
                  if (device.value == file.fileName) {
                      String manufacturer = terminalService.getManufacturerFromDevice("${device.key}");
                      def devicesForManufacturer = terminalService.getDevicesForManufacturerAndType(manufacturer, os.getType());

                     devicesForThisFile.push([device:device.key, manufacturer: manufacturer, devicesForManufacturer: devicesForManufacturer]);
                  }
               }
               devicesForFiles.put(file.fileName,devicesForThisFile);
            }
            logger.debug("devicesForFiles :"+devicesForFiles)
            return [command: this, devicesForFiles: devicesForFiles, files: files, manufacturers: manufacturers];
        } catch (Exception e) {
            logger.warn("FTP threw exception");
            logger.error("Exception", e);
            this.errors.reject("mapGameToDeviceCommand.ftp.connectionTimeOut","A temporary FTP error occurred");
            return [command: this];
        }
    }
    public LinkedHashMap<String, Object> postProcess(sessionObject, params, request) {
        Submission submission = (Submission) sessionObject;
        Properties devices = params.devices;
        Properties files = params.files;

        mapping = devices.inject( [:] ) { map, dev ->
          // Get the first part of the version (up to the first dot)
          def v = dev.key.split( /\./ )[ 0 ]
          map << [ (dev.value): files[ v ] ]

        }
        deviceMapping = new Properties();

        params.files.eachWithIndex { file, i ->
            def device = devices["${file.key}"];
            if (deviceMapping.containsKey("${device}")) {
                this.errors.reject("You cannot use the same device more than once");
                return [];
                //customErrorMessage = "sameDeviceMultipleTimes";
            }
            deviceMapping.put("${device}", "${file.value}");
        }

        if (params.devices != null) {
            this.numberOfDevices = params.devices.size(); //Used for the custom validator later on
        } else {
            this.numberOfDevices = 0;
        }
        //logger.debug("device mapping :"+deviceMapping);
        submission.deviceMapping = mapping;

        return [command: this, deviceMapping: mapping, devicesForFiles: devicesForFiles ];
    }
}

1 Ответ

0 голосов
/ 20 января 2012

Проблема в вашей странице gsp. Убедитесь, что все поля инициализированы значением

<g:text value="${objectInstance.fieldname}" ... />

Кроме того, способ выбора значений осуществляется через id, поэтому обязательно установите его также:

<g:text value="${objectInstance.fieldname}" id=${device.manufacturer.id} ... />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...