我有一個系統,用戶可以從MVC3應用程序中上傳有時大型文件(100-200 MB)。我希望在文件上傳時不要阻止用戶界面,經過一番研究後,它看起來像新的AsyncController可能會讓我做我想做的事情。問題是 - 我看到的每個例子都不是在做同樣的事情,所以我似乎錯過了一件至關重要的事情。多把玩和擺弄之後,這是我當前的代碼:是一個異步控制器apropos在這裏?
public void CreateAsync(int CompanyId, FormCollection fc)
{
UserProfile up = new UserRepository().GetUserProfile(User.Identity.Name);
int companyId = CompanyId;
// make sure we got a file..
if (Request.Files.Count < 1)
{
RedirectToAction("Create");
}
HttpPostedFileBase hpf = Request.Files[0] as HttpPostedFileBase;
if (hpf.ContentLength > 0)
{
AsyncManager.OutstandingOperations.Increment();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (o, e) =>
{
string fileName = hpf.FileName;
AsyncManager.Parameters["recipientId"] = up.id;
AsyncManager.Parameters["fileName"] = fileName;
};
worker.RunWorkerCompleted += (o, e) => { AsyncManager.OutstandingOperations.Decrement(); };
worker.RunWorkerAsync();
}
RedirectToAction("Uploading");
}
public void CreateCompleted(int recipientId, string fileName)
{
SystemMessage msg = new SystemMessage();
msg.IsRead = false;
msg.Message = "Your file " + fileName + " has finished uploading.";
msg.MessageTypeId = 1;
msg.RecipientId = recipientId;
msg.SendDate = DateTime.Now;
SystemMessageRepository.AddMessage(msg);
}
public ActionResult Uploading()
{
return View();
}
現在這裏的想法是讓用戶提交的文件,調用後臺進程,這將做一堆東西(用於測試目的只是拉目前的文件名),同時指導他們到上傳視圖,它只是說「你的文件正在上傳......繼續,我們會在它準備好時通知你」。 CreateCompleted方法通過將消息插入用戶的消息隊列來處理該通知。
所以問題是,我從來沒有得到上傳視圖。相反,我得到一個空白的創建視圖。我無法弄清楚爲什麼。是否因爲CreateCompleted方法被調用,顯示Create視圖?爲什麼會這樣做,如果它返回無效?我只是希望它在後臺默默執行,插入一條消息並停止。
那麼這是正確的做法嗎?我這樣做的全部理由是網絡速度很快,上傳一個文件需要30分鐘,而在當前版本中,它會阻止整個應用程序,直到它完成。我寧願不使用類似彈出窗口的東西,如果我可以避免它,因爲這會涉及彈出窗口阻止腳本等一系列支持問題。
無論如何 - 我已經沒有想法。建議?幫幫我?替代方法我可能會考慮?
在此先感謝。
你是否考慮uploadify? – 2012-01-04 19:55:17