将文件传递给 jqGrid 控制器
Passing a file to jqGrid controller
我正在使用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>
这是我能够让文件数据到达控制器的唯一方法,但它似乎覆盖了网格中的所有其他搜索/排序/分页参数。 如果我将"data"ajax 参数定义为键:对象对,那么网格根本不会重新加载,甚至不会给我一个错误! 如果有人对此有任何建议,我将不胜感激! 非常感谢!
我最终找到了一个相当奇怪的解决方法来解决这个问题,尽管可能不是最好的风格:
最大的问题是将 FormData 对象(文件)从视图传递到控制器需要 AJAX 调用的"processingData"属性为 false。 我无法在 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"作为查询的一部分。
相关文章:
- 在指令控制器中使用$attrs时出现问题
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 从控制器返回后Ajax启动事件激发
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- 如何在单击复选框后调用控制器方法
- 在控制器和数据对象之间同步数据
- 将Javascript数组发送到控制器ASP.NET MVC
- jqGrid树网格问题
- 角度控制器结构
- 如何在Jquery中发布后将值从视图返回到控制器
- 将值从html传递到AngularJS控制器
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 从控制器继承了隔离的作用域以生成可重用的指令
- Intercept the cellSubmit jqGrid
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 为什么不't我的变量在我的控制器中填充后在我的视图中呈现
- Nodejs API控制器,用于在API之间切换
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 将不在模型中的数据返回到mvc控制器
- 将文件传递给 jqGrid 控制器