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>元素中。