关于jquery.form.js插件的无刷新上传文件使用的问题

    (一)如何使用:它的文件无刷新上传写法跟jquery的ajax差不多,也不多说了,看下面代码估计就知道了,注意设置表单属性enctype="multipart/form-data"

 (二)遇到问题:ASP.NET MVC中返回JsonResult对象时,IE8提示下载文件

  (1)看我是如何操作的:利用如下代码无刷新上传文件

var options = {
        target: '#outputdiv',
        beforeSubmit: showRequest,
        success: function (data) {           
  if (data.Success == true) {
            } else {             
  alert('导入失败!请注意检查excel的格式!');
            }
        },
        error: function () {
            alert("请求出错");
        }     
 };
 $('#fileUpload').ajaxSubmit(options);

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult ExcelUpload(HttpPostedFileBase fileUpload){
    /**此处省略json对象的处理代码*/
    return Json(json);

  (2)在Chrome没有发现不正常,但是在IE8却发现提示下载文件。这个真是一个纠结。后面看看问题所在吧。

    IE 不支持 contentType 为application/json,在 ajax 上传文件完成后返回 json时 IE 提示下载文件。

 这下,应该有点感觉了吧?其实,我们的controller返回的是json的对象啊!这个得从http协议说起,http响应头有个ContentType ,它告诉浏览器返回的内容是什么类型。一般的文本、html响应的头中contentType为text/html而在我们这样的操作中,会返回application/json的响应头,不识别application/json的浏览器下就认为是文件了,所以嘛,呵呵。

  (3)解决方法

    在jquery.form.js这个插件中, 其实是模拟ajax,它也是一个iframe去submit 接着从iframe域取响应的文本。它的实现是利用返回的responseText来处理。也就是说,你要是返回一个text/html的contentType,那它就能接收到,并且对这个返回的数据进行处理。因此,我们返回的不应该是一个json对象,而是一个json字符串!

  好吧,说了这么多,也该大致清楚了,其后台的处理用代码表示大致是这样:

HttpContext.Response.Clear();

  HttpContext.Response.ContentType = "text/html";

  HttpContext.Response.Write("{\"result\":true}");

  HttpContext.Response.End();

  asp.net mvc中正确的处理方法是:设置option的{ dataType: 'json'} 属性,而在返回中可以这样写 return Json(json,"text/html");

        java 中的处理方法是,response.ContentType = "text/html";response.Write("{\"result\":true}");

    以上属于个人看法,具体不对的地方欢迎指教!微笑

你可能感兴趣的:(关于jquery.form.js插件的无刷新上传文件使用的问题)