如何在不呈现新视图的情况下调用 Grails 控制器中的方法?



我有一个页面,允许随着时间的推移逐步构建PDF文件(将信息保存到数据库(。我还添加了保存图像的功能。我目前有一个<g:uploadForm>将文件发送回控制器中的upload方法(然后调用服务(。但是,上传完成后,Grails 会尝试呈现与upload方法关联的视图,最终成为空白页。我希望具有将文件发送到后端Grails的功能,而无需重新加载视图(因为它会删除任何已输入但未保存的数据(。我还有一个使用JavaScript向Grails服务器发出AJAX请求的工作版本,但我更喜欢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 formatnExpected org.springframework.web.multipart.commons.CommonsMultipartFilenGot ${params.imgfile.getClass()}n"
}
} else {
System.err << "No file suppliedn"
}
response.sendError(200, "Done")
}

一切都运行良好,除了单击Upload按钮后,它会转到像mysite.com/myapplication/controller/upload/id:id这样的 URL,这只是一个空白页(/id:id部分是故意的(。

我可以使用JavaScript来做到这一点,但我对Groovy/Grails解决方案感兴趣。我的问题是如何在不加载新视图的情况下使用控制器方法。

一般来说,听起来你需要看看ajax对请求和上传的处理,而不仅仅是一个完整的请求/响应周期。 有很多关于如何使用JQuery,或纯javascript或任何你想使用的框架上传文件的例子。 看看其中之一,我想你会发现它提供了你正在寻找的解决方案。

据我从大量研究中可以看出,没有办法做到这一点。它归结为Grails的"约定优于配置"。当控制器中的函数被调用时,它总是希望呈现一个新视图,因为这就是Grails的工作方式。我似乎最接近的是再次渲染当前页面,但这并不完全相同。

实际上,解决方案是使用 AJAX,但问题的答案是,如果不呈现新视图,就无法调用控制器。

最新更新