4

我正在使用Jquery Ajax窗体上传文件,这在Chrome和Firefox中运行良好,但它在IE中不起作用。它弹出一个窗口,告诉我保存我正在上传的文件。带有文件上传功能的JQuery Ajax窗体在IE中不工作

我的代码的例子,如果必要的话,是仪式在这里: HTML:

<div class="addNewDocumentContent"> 
<form id="AddNewDocForm" action="@Url.Action("AddNewDocument", "BidForm")" enctype="multipart/form-data" method="post"> 
<div> 
    <input name="File" type="file" style="width: 80%;" /> 
</div> 
<div> 
    <label> 
     @Labels.Name</label> 
    <input type="text" name="Name" style="width: 80%;" /> 
</div> 
<div style="text-align: right;"> 
    <button type="button" name="Back" value="Back"> 
     @Buttons.GoBack 
    </button> 
    <button type="submit" name="Add" value="Back"> 
     @Buttons.Add 
    </button> 
</div> 
</form> 

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<DocumentModel> documents = null; 
      if (Session["Documents"] != null) 
      { 
       documents = (List<DocumentModel>)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<DocumentModel>(); 
       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以外的所有浏览器。我可能不是唯一的,但我还没有找到答案。

回答

3

我还没有一个textarea试过没,但如果我定义的内容类型的动作为text/html内返回正常工作:

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

尝试添加缓存: '假' 你的AJAX调用内部... 喜欢的东西:

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

} 
}); 
4

这个问题has beenmany times。发帖前请先搜索。该documentation规定很清楚:

浏览器支持了XMLHttpRequest 2级就能 上传文件无缝甚至得到进度更新的上传 收益。对于旧版浏览器,使用回退技术,其中 涉及iframe,因为不可能使用XMLHttpRequest对象的第1级实现上载文件。这是常见的 后备技术,但它有固有的局限性。 iframe 元素用作表单提交操作的目标,其中 表示将服务器响应写入iframe。如果响应类型是HTML或XML,但是如果 响应类型是脚本或JSON,这两个都很好,但两者通常都包含 字符,如果在HTML中找到 ,则需要使用实体引用来重复使用该字符,这是行不通的 标记。

要使用 当IFRAME模式占脚本和JSON响应的困难,这个插件可以让这些反应被嵌入在textarea元素 ,建议您使用时,这些 响应类型这么做结合文件上传和较旧的浏览器。但请注意,如果 表单中没有文件输入,则请求将使用正常的XHR来提交表单(不是 iframe)。这会让服务器代码的负担知道何时使用 textarea以及何时不使用。

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