用Extjs提交表单后,请求有返回数据,但success函数的action里取不到返回结果

用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页面的样式展现上保持一致