带有文件上载的JQuery Ajax表单在IE中不起作用

我正在使用Jquery Ajax Form上传文件,这在Chrome和Firefox中运行良好,但它在IE中不起作用。 它会弹出一个窗口,告诉我保存我要上传的文件。

我的代码的一些示例,如果有必要,在这里是仪式:HTML:

JS:

 //Document Ready============================================================================= $(function () { $('#AddNewDocForm').ajaxForm({ type: 'POST', beforeSubmit: function () { return $("#AddNewDocForm").valid(); }, success: function (documents) { FillDocuments(documents); $('#dialogAddNewDocument').dialog('close'); } }); }); //Validate==================================================================================== //Validation===================================================================================== $(function () { $("#AddNewDocForm").validate({ ignore: ":not(:visible)", rules: { File: "required", Name: "required" } }); }); //========================================================================================= 

行动

 [HttpPost] public JsonResult AddNewDocument(DocumentModel document) { if (ModelState.IsValid) { List documents = null; if (Session["Documents"] != null) { documents = (List)Session["Documents"]; var doc = documents.OrderByDescending(x => x.Number).Take(1).FirstOrDefault(); document.Number = doc != null ? doc.Number + 1 : 1; document.FileName = document.File != null ? document.File.FileName : document.FileName; documents.Add(document); } else { documents = new List(); document.Number = 1; document.FileName = document.File != null ? document.File.FileName : document.FileName; documents.Add(document); Session["Documents"] = documents; } var displaydocs = documents.Select(x => new { Name = x.Name, Number = x.Number, File = x.File != null ? x.File.FileName : x.FileName, Route = x.Route != null ? x.Route : "#", }); return Json(displaydocs, JsonRequestBehavior.AllowGet); } else { return null; } } 

最后模型:

  public class DocumentModel { public int Number { get; set; } [Required] public string Name { get; set; } [Required] public HttpPostedFileBase File { get; set; } public string FileName { get; set; } public string Route { get; set; } } 

同样,它适用于IE8以外的所有浏览器。 我可能不是唯一一个,但我还没有找到答案。

这个问题已被多次询问过。 请在发布前搜索。 文件清楚地说明了这一点:

支持XMLHttpRequest Level 2的浏览器将能够无缝上传文件,甚至可以在上传过程中获得进度更新。 对于较旧的浏览器,使用了涉及iframe的回退技术,因为无法使用XMLHttpRequest对象的1级implmentntation上传文件。 这是一种常见的后备技术,但它具有固有的局限性。 iframe元素用作表单提交操作的目标,这意味着服务器响应被写入iframe。 如果响应类型是HTML或XML,则这很好,但如果响应类型是脚本或JSON,则这两种方法都不起作用,这两种方法通常都包含在HTML标记中找到时需要使用实体引用来重复的字符。

为了解决使用iframe模式时脚本和JSON响应的挑战,Form Plugin允许将这些响应嵌入到textarea元素中,建议您在与文件上载和更早版本结合使用时对这些响应类型执行此操作。浏览器。 但请注意,如果表单中没有文件输入,则请求使用普通XHR提交表单(而不是iframe)。 这会给您的服务器代码带来负担,以便知道何时使用textarea以及何时不使用。

由于您从控制器操作返回JSON,因此您需要尊重文档所说的内容=>包装在元素中。

我还没有尝试使用textarea,但是如果我定义内容类型以在text / html中返回操作,它可以正常工作:

  return new JsonResult() { ContentType = "text/html", Data = result }; 

尝试在AJAX调用中添加缓存:’false’…类似于:

  $.ajax({ type:"POST", url:'process.php', cache:'false', //IE FIX data: data, success: function(){ //on success do something... } });