asp.net mvc ajax上传文件 然后返回json

    本来,通过jquery from,ajax上传文件挺容易的,但是,上传完之后想返回json的话,颇费了一些周折。

    asp.net mvc 中可以直接返回一个JsonResult,例如

   

ExpandedBlockStart.gif 代码
public  JsonResult UploadImage()
        {
      //上传文件的处理
            
return   new  JsonResult
                             {
                                 Data 
=  _imageService.NewUrl,
                                 JsonRequestBehavior 
=  JsonRequestBehavior.AllowGet
                             };
        }

 

然后

 

ExpandedBlockStart.gif 代码
$().ready(function () {
            var options 
=  {
                dataType: 
' json ' ,
                beforeSubmit: showRequest,
                error:showError,
                success: showResponse
            };
            $(
' #myform ' ).ajaxForm(options);
        });

        function showRequest(formData, jqForm, options) {
            alert(
' 发送前 ' );
            
return   true ;
        }
        function showError(data) {
            alert('error');
        }

        function showResponse(data, status) {
            alert(
' 发送后 ' );
        }

 

 

做完这些,应该就能读取Json,没想到跳出一个文件保存窗口,保存下来的内容,就是我们发送的Json。

百度了一番,发现不仅asp.net平台有问题,J2EE平台也有这么个问题,解决的办法,是直接返回HTML。

 

public ActrionResult UploadImage()
{
  return  Content( " {error: 'file size is zero'} " " text/html " );
}

 

 这样做之后,终于alert了,但是弹出的信息是error。

仔细研究了一下jquery form官方的例子,发现json内容应该被<textarea>包围

修改后如下:

 

public  ActrionResult UploadImage()
{
  
return  Content( " <textarea>{error: 'file size is zero'}</textarea> " " text/html " );
}

 

 修改完成后,依然跳到showError,通过搜索引擎再没搜索到有用的信息,不得不调试jquery.form.js

搜索textarea,很容易找到了合适的断点

 

ExpandedBlockStart.gif 代码
try {
if  (opts.dataType  ==   ' json '   ||  opts.dataType  ==   ' script ' ) {
                    
//  see if user embedded response in textarea
                    var ta  =  doc.getElementsByTagName( ' textarea ' )[ 0 ];
                    
if  (ta)
                        xhr.responseText 
=  ta.value;
                    
else  {
                        
//  account for browsers injecting pre around json response
                        var pre  =  doc.getElementsByTagName( ' pre ' )[ 0 ];
                        
if  (pre)
                            xhr.responseText 
=  pre.innerHTML;
                    }              
                }
                
else   if  (opts.dataType  ==   ' xml '   &&   ! xhr.responseXML  &&  xhr.responseText  !=   null ) {
                    xhr.responseXML 
=  toXml(xhr.responseText);
                }
                data 
=  $.httpData(xhr, opts.dataType);   // 这里报错
            }
            
catch (e){
                log(
' error caught: ' ,e);
                ok 
=   false ;
                xhr.error 
=  e;
                $.handleError(opts, xhr, 
' error ' , e);
            }

 

 

catch到的信息是“Invalid JSON”。原来从jquery1.4开始,键和值都必须使用两个引号包围,改为以下内容之后解决

 

return  Content( " <textarea>{'error': 'file size is zero'}</textarea> " " text/html " );

 

在这个问题上,耗费了一整天的时间,记录下来整个过程,希望其他人能用上

转载于:https://www.cnblogs.com/kmhz/archive/2010/06/25/1765490.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值