用Extjs提交表单后,请求有返回数据,但success函数的action里取不到返回结果
/**
* 打开数据项导入窗口
*/
function openDataItemImportWnd() {
Ext.create('Ext.window.Window', {
title: '导入数据项',
autoHeight: true,
width: 400,
modal: true,
layout: 'fit',
items: {
xtype: 'form',
method : 'POST',
url: "importDataItemStructure.up",
standardSubmit: false,
items: [{
xtype: 'filefield',
emptyText: '请选择要上传的xls文件',
id: 'filefield_yY71MXsb',
name: 'fileName',
allowBlank: "false",
width: 300,
hideLabel: 'false',
labelAlign: 'right'
}],
buttons: [{
text: '导入',
formBind: true,
handler: function(button) {
Ext.getBody().mask('数据导入中...');
// 获取表单的值
var form = button.up('form').getForm();
form.submit({
success: function(form, action) {
console.dir(action);
Ext.Msg.alert('Success', action.result.info.message);
},
failure: function(form, action) {
Ext.Msg.alert('Failed', action.result ? action.result.info.message : 'No response');
}
});
Ext.getBody().unmask();
}
}, {
text: '取消',
handler: function(button) {
button.up('window').destroy();
}
}]
}
}).show();
}
谢谢大家,让我排除了很多走弯路的可能。
认真看了下Extjs的API,其中关于文件上传表单提交的一段:
文件上传不能用标准“Ajax”技术执行,也就是不能执行XMLHttpRequests。 作为替代,一个隐藏的包含全部域的
元素被暂时创建,并与其target提交设置为指向一个动态生成的, 隐藏的被插入到document,但是在返回数据已经收集后被移除。
请求的返回结果被返回给了那个隐藏的里的document。
在主页面中添加这个监听函数,当上传完成后,就去里的document里去取得返回结果。
Ext.data.Connection.prototype.onUploadComplete=function(frame, options) {
//到Iframe里去取返回结果。
}
我后台是用的Spring框架,构造好ModelMap,直接由Spring自动返回给页面的。
按以上思路取到了返回结果。
不过我想,Extjs应该把从iframe里取结果的逻辑封装好才是合理的呀。为什么还要自己手动去写?
以前没用过Extjs框架,不知道如果后台不是Spring框架自动返回结果,而是自己直接用response返回结果是不是页面上就不用自己麻烦去写取结果的代码了。这一个待验证。
用火狐浏览器调试一下,看看返回的字符串,是否有你需要的值。
浏览器的console里看到一句这样的提示:
Resource interpreted as Document but transferred with MIME type application/json:
有没有大神能帮我看看呀?明明有返回数据,但就是取不到值,纠结了两天了。
数据示这个{"success":true,"info":{"message":"数据项名称已经存在","resultCode":"VALIDATION_ERROR","resultDescription":"校验错误","success":false}}
那么这个
Ext.Msg.alert('Success', action.result.info.message);
就应该取得到值才对。
如果没有渠道,那么你返回的字符串就应该不是json格式的,只是看起来像json格式。这只是我猜测。
你可以一次输出看看是否有值
比如alert(action.result)
alert(action.result.info)
看看这两个是否有值。
浏览器里的Resonpse Header里,显示返回的是JSON呀:
Content-Language:zh-CN
Content-Length:148
Content-Type:application/json; charset=UTF-8
Server:Jetty(6.1.5)
action.result,这个alert后是Null
开发工具看ajax实际返回了什么内容,你的 form.submit({回调执行到failure还是success?
/mdmng/dataitem/importDataItemStructure.up动态页修改content-type为text/html试试
看你和一个人对话,中间有这样一句:responseXML: null ,,,为啥返回是xml?,
Resource interpreted as Document but transferred with MIME type application/json:
如果是这个错误,那么应该
这有由于HTTP Response Header中指定的MIME 类型 与文件类型不匹配
不同的浏览器可能返回姐结果不一样
FireFox,Chrome,会遇到上述问题
HTML页面在加入了<!DOCTYPE html>或者其他指定HTML页面文档类型的说明时,才能保证,在IE和其他浏览器HTML页面的样式展现上保持一致