(一)如何使用:它的文件无刷新上传写法跟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}");
以上属于个人看法,具体不对的地方欢迎指教!