2012-10-10 112 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調用發佈您的列表普惠制將數據傳遞到控制器代替,那麼你仍然可以做到這一點。 (但這將是一個骯髒的做法)