2012-10-10 57 views
2

我为我的grails应用程序使用了导出插件。我如何将一个列表实例传递给控制器​​?我有这个在我的GSP:从gsp传递给控制器​​的值

<g:set var="fruitInstanceList" name="fruitInstanceList" value="${fruitInstanceList}"/> 
    <export:formats formats="['csv', 'excel', 'ods', 'pdf', 'rtf', 'xml']"/> 

,并在我的控制器:

if(params?.format && params.format != "html"){ 
    response.contentType = grailsApplication.config.grails.mime.types[params.format] 
    response.setHeader("Content-disposition", "attachment; filename=books.${params.extension}") 
     exportService.export(params.format, response.outputStream,params.fruitInstanceList, [:], [:]) 
    } 

的代码不工作,因为fruitInstanceList没有被传递给控制器​​。我怎样才能做到这一点?使用上面的代码将gsp的值传递给控制器​​?

请帮忙,谢谢。

+0

但你如何从视图调用控制器? –

回答

0

此变量仅适用于该页面。您可以使用PARAMS

<export:formats formats ="[]", params ="[fruitInstanceList:${fruitInstance}]"/> 
0

您无法通过列表从视图参数传递。因为,params将以get方式进入控制器,参数将连接到URL,并且将作为字符串转换。

所以你想要做的是,你需要做的动作在你使用导出代码的逻辑。

即,如何获取控制器中的列表并将其发送到视图?像同样的方式,在这里你必须做一些业务逻辑并获取列表,然后将其发送到导出插件。

1

您不必一直将您的报告数据传回控制器。您从控制器获取了这些数据(这里是'fruitInstanceList'),可能是基于某些过滤器选项。 您所需要做的就是再次向控制器发送过滤器选项,然后控制器将获取相同的数据(即'fruitInstanceList'),然后将其导出为您所需的格式。斯凯尔顿代码看起来像以下:

reportFilter.gsp

<form name="fruitsFilterForm" action="fruitsReport" controller="report"> 
    <input type="text" name="search" value="${params.search}" /> 
    <input type="submit" value="Show Report" /> 
</form> 

fruitsReport.gsp

<form name="reportExportForm" action="exportFruitsReport" controller="report"> 
    <input type="text" name="search" value="${params.search}" /> 
    <input type="hidden" name="format" value="${defaultFormat}" /> 
    <input type="submit" value="Export" /> 
</form> 

ReportController.groovy

def reportService 
def fruitsReport() { 
    def fruitInstanceList = reportService.fetchFruitsList(params); 
    [fruitInstanceList: fruitInstanceList, params: params, defaultFormat: "excel"] 
} 

def exportFruitsReport() { 
    def fruitInstanceList = reportService.fetchFruitsList(params); 

    /** All your code to export the fetched fruitInstanceList **/   
} 

ReportService.groovy

def fetchFruitsList(params) { 
    return Fruit.findAll(/* your query based on the params */) 
} 

注意

如果你仍然坚持用Ajax调用发布您的列表普惠制将数据传递到控制器代替,那么你仍然可以做到这一点。 (但这将是一个肮脏的做法)