Как вызвать метод в контроллере Grails без рендеринга нового представления?

У меня есть страница, которая позволяет постепенно создавать PDF-файл (сохранение информации в базе данных). Я также добавляю возможность сохранять изображения. У меня сейчас есть <g:uploadForm> отправив файл обратно upload метод в контроллере (который затем вызывает службу). Однако после завершения загрузки Grails пытается отобразить представление, связанное с upload метод, который заканчивается пустой страницей. Я хочу иметь функциональность отправки файла на сервер Grails без необходимости перезагружать представление (так как это избавит от любых данных, которые были введены, но не сохранены). У меня также есть рабочая версия, использующая JavaScript для выполнения AJAX-запроса к серверу Grails, но я бы предпочел решение Grails.

Вот соответствующая часть ВСП:

<g:uploadForm action="upload" useToken="true" id="5">
  <div class="chooseFileButtonContainer">
    <input type="file" name="imgfile" class="chooseFileButton" />
  </div>
  <div class="uploadFileButtonContainer">
    <input type="button" value="Upload File" /> 
  </div>
</g:uploadForm>

Вот контроллер:

def uploadToSP() {
  if (params.imgfile) {

    if (params.imgfile instanceof org.springframework.web.multipart.commons.CommonsMultipartFile) {
      def (sectionID, reportID) = params.id.tokenize(':')
      try {
        Service.upload(params.imgfile, sectionID, reportID)
      } catch (Exception e) {
        System.err << "Upload Failed : " + e.getMessage() +"\n"
      }
    } else {
      System.err << "Invalid file format\nExpected org.springframework.web.multipart.commons.CommonsMultipartFile\nGot ${params.imgfile.getClass()}\n"
    }
  } else {
    System.err << "No file supplied\n"
  }
  response.sendError(200, "Done")
}

Все работает очень хорошо, за исключением того, что после нажатия Upload Кнопка, он идет на URL-адрес, как mysite.com/myapplication/controller/upload/id:id которая просто пустая страница (/id:id часть нарочно).

Я могу сделать это с помощью JavaScript, но меня интересует решение только для Groovy/Grails. Мой вопрос заключается в том, как использовать метод контроллера без загрузки нового представления.

2 ответа

Решение

Насколько я могу судить по многим исследованиям, нет никакого способа сделать это. Это сводится к "соглашению о конфигурации" Грааля. Когда вызывается функция в контроллере, она всегда хочет отобразить новое представление, потому что именно так работает Grails. Самое близкое, что я могу получить, - это просто перерисовать текущую страницу заново, но это не совсем то же самое.

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

В общем, похоже, что вам нужно смотреть на обработку запросов и загрузок ajax, а не на полный цикл запроса / ответа. Есть много примеров того, как загрузить файл, используя JQuery, или простой javascript, или действительно любой фреймворк, который вы хотите использовать. Взгляните на один из них, и я думаю, вы найдете, что он обеспечивает решение, которое вы ищете.

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