atty24
2015-06-09 08:30
采纳率: 100%
浏览 3.8k
已采纳

用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();
}
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • atty24 2015-06-10 09:38
    已采纳

    谢谢大家,让我排除了很多走弯路的可能。

    认真看了下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返回结果是不是页面上就不用自己麻烦去写取结果的代码了。这一个待验证。

    打赏 评论
  • 我是主厨 2015-06-09 08:33

    用火狐浏览器调试一下,看看返回的字符串,是否有你需要的值。

    打赏 评论
  • atty24 2015-06-09 08:46

    浏览器的console里看到一句这样的提示:
    Resource interpreted as Document but transferred with MIME type application/json:

    有没有大神能帮我看看呀?明明有返回数据,但就是取不到值,纠结了两天了。

    打赏 评论
  • 我是主厨 2015-06-09 08:46

    数据示这个{"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)
    看看这两个是否有值。

    打赏 评论
  • atty24 2015-06-09 08:53

    浏览器里的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试试

    打赏 评论
  • 另一花生 2015-06-09 13:26

    看你和一个人对话,中间有这样一句: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页面的样式展现上保持一致

    打赏 评论

相关推荐 更多相似问题