您的位置:首页 > Web前端 > JQuery

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

2012-12-12 09:40 1081 查看
(一)如何使用:它的文件无刷新上传写法跟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}");

以上属于个人看法,具体不对的地方欢迎指教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: