2013-10-30 44 views
0

我正在使用Grails和jqGrid,並試圖讓一個奇怪的擴展工作: 我想讓用戶上傳一個文件,該文件將被傳遞給jqGrid控制器並用於過濾數據。例如,該文件是一個名稱列表,網格將被過濾爲包含這些名稱的行。有沒有簡單的方法來做到這一點?傳遞文件到jqGrid控制器

我一直在嘗試使用AJAX fileuploader與FormData對象,並試圖將它附加到jqGrid params。我已經得到最接近的是使用下面的,雖然我得到一些奇怪的行爲:

<g:form enctype="multipart/form-data" class="upload" name="fileinfo" id="fileinfo"> 
    <input name="uploadField" id="uploadField" type="file" value=""> 
    <input id="btnFilterFile" type="button" onclick="addFileFilter()" value="Apply Filter"/> 
</g:form> 

<table id="theGrid"></table> 

<script> 
function addFileFilter() { 
    var oData = new FormData(document.forms.namedItem("fileinfo")); 
    $("#theGrid").setGridParam({ajaxGridOptions: 
     {processData:false, type:'POST', data:oData}}); 

    $("#theGrid").trigger("reloadGrid"); 
} 
</script> 

這是我已經能夠得到文件數據到達控制器的唯一途徑,但它似乎覆蓋來自網格的所有其他搜索/排序/分頁參數。如果我定義「數據」ajax參數是一個關鍵:對象對,那麼網格將不會重新加載,它甚至不會給我一個錯誤!如果有人對此有任何建議,我會非常感激!非常感謝!

回答

0

我最終找到一個比較奇怪的變通對於這一點,解決了這個問題,雖然可能不是最好的風格:

最大的問題是,從視圖中傳遞FORMDATA對象(文件)來控制要求AJAX調用的「processingData」屬性是錯誤的。我無法在jqGrid本身中使用它,所以我做了一個單獨的AJAX調用,它將FormData對象發送到控制器並將其保存在全局變量(錯誤樣式!)中。另一種選擇是將它保存在域中,但全局變量對我來說很好。我的控制器動作就是使用全局變量進行過濾。我只需要確保在首次訪問該頁面時清除全局變量(使用另一個Ajax調用)。

這裏是從視圖代碼示例:

<style> 
function clearFileField() { 
    $("#uploadField").val(""); 
    var url="${createLink(controller:"${pageType}",action:'clearFileFilter')}"; 
    jQuery.ajax({ 
     async: false, 
     url: url, 
     type:'POST', 
     success: function(data) { 
      $("${gridId}").trigger("reloadGrid"); 
     } 
    }); 
} 

function addFileFilter() { 
    var oData = new FormData(document.forms.namedItem("fileinfo")); 
    var url="${createLink(controller:"${pageType}",action:'saveFileFilter')}"; 
    jQuery.ajax({ 
     async: false, 
     url: url, 
     type:'POST', 
     data: oData, 
     processData:false, 
     contentType: false 
    }); 
    $("${gridId}").trigger("reloadGrid"); 
} 

$("#btnFilterByHostFile").click(function() { 
    addFileFilter(); 
}); 

$(document).ready(function() { 
    clearFileField(); 
} 
</script> 

<g:form enctype="multipart/form-data" class="upload" name="fileinfo" id="fileinfo"> 
    <input name="uploadField" id="uploadField" type="file" value=""> 
</g:form> 

,這裏是控制器的操作:

def static List<String> filterList = new ArrayList() 

def saveFileFilter = { 
    InputStream is = params.uploadField?.getInputStream() 
    def fileString = is.readLines() 
    is.close() 

    filterList = fileString 
    def response = [state: "OK", id: 1] 
    render response as JSON 
} 

def clearFileFilter = { 
    filterList = [] 
    def response = [state: "OK", id: 1] 
    render response as JSON 
} 

然後在該jqGrid的控制器動作,我就可以用「filterList」作爲查詢的一部分。