2017-06-05 202 views
1

我正在使用ajax向我的服務器端發出發佈請求,我正在創建一個文件,一旦該文件已經創建,我需要在我的瀏覽器中顯示它,我讀過使用ajax是不可能顯示該文件,但我可以在我的ajax函數中使用我的success事件來調用服務器端的另一個方法,我一直試圖將該文件存儲爲內存中的字節數組,使用TempData或甚至Session變量,然後使用另一種方法在ajax success(稱爲DisplayFile)上讀取它們,但在調用DisplayFile方法時TempData變量始終爲空......如果您有不同的建議可以這樣做,一直在考慮將字節數組發送給JQuery,然後讓另一個請求將它作爲參數傳遞,但它是一個字節很長的陣列..,我不知道爲什麼TempData值爲null時DisplayFile方法是從客戶端叫...訪問TempData變量

$.ajax({ url: "/FileManagement/Files", 
     type: 'post', 
     data: formData, 
     success: function(result){ 
      window.location = "/FileManagement/DisplayFile" 
} 
}) 

public JsonResult Files(//parameters...) 
{ 
//...some code 
TempData["BytesArray"] = fileBytes; //fileBytes is an array of bytes 
TempData["FileName"] = fileName; 
} 

public ActionResult DisplayFile() 
{ 
var file = TempData["BytesArray"]; //null 
var fileName = TempData["FileName"]; 
} 

UPDATE 它現在用Session變量,而不是工作的TempData的,也許是因爲這個控制器在Areas文件夾中?此控制器不在Controllers文件夾內,也許它與此有關,爲了讓Session工作,我不得不使用它的完整路徑:System.Web.HttpContext.Current.Session["test"] = "asasa";我仍然試圖找出爲什麼TempData的值爲null當第二種方法被稱爲...

+0

如果您將文件存儲在某處,則會將某個文件標識符返回給Ajax響應,而另一個控制器操作應將該標識符作爲輸入並從存儲中檢索文件內容並使其可供下載。 –

+0

@ChetanRanpariya我正在使用這種方法,但文件被異步存儲,當我嘗試訪問它有時它還沒有被創建,這就是爲什麼我試圖檢索文件作爲一個字節數組,然後顯示它,感謝您的建議 – AlexGH

+0

我確實做了你想做的事情。它爲我工作。我上傳了該項目供您參考:https://1drv.ms/u/s!Ag2RGwevtqKWhmUkk_tRgJFIoMlA – Saket

回答

0

我終於結束了使用Session變量,我使用的是Areas文件夾內的一個控制器,所以也許正因爲如此TempData不工作的方式我希望,爲Session變量,以該控制器我必須使用的完整路徑它的工作,而在Controllers文件夾內的控制器我不需要使用該路徑..

public JsonResult Files(//parameters...) 
{ 
//...some code 
    System.Web.HttpContext.Current.Session["FileInBytes"] = bytesArray; //fileBytes is an array of bytes 
    System.Web.HttpContext.Current.Session["FileName"] = fileName;; 
} 

public ActionResult DisplayFile() 
{ 
    var fileInBytes = Session["FileInBytes"] as byte[]; 
    var fileName = Session["FileName"] as string; 
    Session.Remove("FileInBytes"); 
    Session.Remove("FileName"); 
}