2012-01-19 2 views
0

동적 목록 상자가있는 페이지가 있습니다 (첫 번째 목록에서 값을 선택하면 두 번째 목록 상자에 값이 채워짐).페이지를 새로 고치지 않고 grails에서 오류를 표시합니다.

목록 상자의 유효성 검사 오류가 정상적으로 작동하지만 오류 메시지가 표시되는 동안 페이지가 새로 고쳐지고 선택한 값이 초기 상태로 설정되었습니다 (목록 상자에서 다시 값을 선택해야 함)

이 페이지는 ajax 호출을 사용하여 여러 개의 목록 상자를 추가하도록 설계되었으므로 값을 다시 추가하고 선택하는 것은 재 작업이 될 것입니다.

유효성 검사 오류를 표시하고 선택한 값을 그대로 유지하는 데 도움이 될 수 있습니까? (이전에는 전역 변수로 전처리 및 후행 처리의 로컬 변수를 대체하여 해결 된 비슷한 상황에 직면했습니다. 이번에는 그럴 필요가 없습니다. 방법)

어떤 힌트/도움

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 ]; 
    } 
} 
+0

귀하의 질문이 너무 모호합니다. 지금까지 시도한 것에 대한 예제 코드를 제공해야합니다. 이 질문에 대한 답변은 실용적인 방법이 없습니다. – OverZealous

+0

코드로 질문을 수정했습니다 ... 감사합니다 – Techie

답변

0

문제는 당신의 GSP 페이지에 좋은 것입니다. 그래서뿐만 아니라 그것을 설정해야합니다, ID를 통해 모든 필드가 또한 값

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

이 값을 선택하는 방식으로 초기화되었는지 확인 :

<g:text value="${objectInstance.fieldname}" id=${device.manufacturer.id} ... /> 
+0

내 모든 은 값을 가지고 있습니다 ... 등 – Techie

+0

g : 선택 사항입니다. id = $ {device.manufacturer.id} – fixitagain

+0

흠, 내가 그것을 시도하고 업데이 트하자 .... 응답을 위해 대단히 감사합니다 – Techie

관련 문제