0

我正在使用 Grails 和 jqGrid 并试图让一个相当奇怪的扩展工作:我想让用户上传一个文件,该文件将传递给 jqGrid 控制器并用于过滤数据。例如,该文件是一个名称列表,网格将被过滤为包含这些名称的行。有什么简单的方法可以做到这一点吗?

我一直在尝试将 AJAX 文件上传器与 FormData 对象一起使用,并尝试将其附加到 jqGrid 参数。我得到的最接近的是使用以下内容,尽管我得到了一些奇怪的行为:

<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 参数定义为键:对象对,那么网格将不会重新加载,甚至不会给我一个错误!如果有人对此有任何建议,我将不胜感激!非常感谢!

4

1 回答 1

0

我最终找到了一个相当奇怪的解决方法来解决这个问题,虽然可能不是最好的风格:

最大的问题是从视图传递 FormData 对象(文件)到控制器需要 AJAX 调用的“处理数据”属性为假。我无法在 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”作为查询的一部分。

于 2013-11-01T00:44:30.743 回答