Как вызвать метод в контроллере 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, или действительно любой фреймворк, который вы хотите использовать. Взгляните на один из них, и я думаю, вы найдете, что он обеспечивает решение, которое вы ищете.