2011-02-07 47 views
6

Trong ứng dụng của tôi, tôi đang tạo tệp zip để Người dùng tải xuống một số thông tin cơ sở dữ liệu đã xuất. Tệp zip được tạo khi người dùng nhấp vào nút "tạo dữ liệu" và tôi ghi lại yêu cầu trong cơ sở dữ liệu.Bắt đầu tải xuống tệp sau khi đăng lại

Trên trang của tôi, tôi có GridView hiển thị lịch sử tải xuống của Người dùng và cũng cung cấp cho họ khả năng tải xuống tệp được tạo mới nhất trong một khoảng thời gian nhất định.

Vấn đề tôi gặp phải là khi họ nhấp vào nút, tôi muốn trang làm mới (do đó làm mới GridView và hiển thị yêu cầu mới nhất của họ) và sau đó bắt đầu tải xuống tệp cho họ (IE, hãy bật lên nhắc nhở và để họ quyết định xem có nên mở/lưu/hủy bỏ nó hay không).

Tôi có thể bắt đầu tải xuống trên bài đăng, nhưng Gridview của tôi không cập nhật trước khi nó bắt đầu để nó không hiển thị yêu cầu mới nhất trong danh sách. Làm thế nào tôi có thể nhận được GridView để cập nhật TRƯỚC KHI lời nhắc tải xuống bắt đầu?

Tôi đang sử dụng sau đây để bắt đầu tải về:

public void BeginDownload() 
    { 
     FileDownload download = InventoryService.GetLastThreeFileDownloads(this.EmployeeId).First(); 
     FileInfo fi = new FileInfo(Server.MapPath(SERVER_DOWNLOAD_PATH) + download.DownloadFileName); 

     Response.Clear(); 
     Response.ContentType = "application/zip"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + fi.Name); 
     Response.TransmitFile(fi.FullName); 
     Response.Flush(); 
    } 

Phương pháp này được gọi là trong sự kiện Page_Load như mục cuối cùng, nếu một lĩnh vực ẩn được thiết lập là true (mà tôi thiết lập khi họ click nút để xây dựng tệp).

Tôi cũng đã thử thực hiện việc này thông qua các cuộc gọi jQuery/AJAX để làm mới trang và bắt đầu tải xuống với ít thành công. Tôi đã nghĩ về việc mở một hộp thoại phương thức và cho phép họ nhấp vào một liên kết để bắt đầu tải xuống và sau đó làm mới trang khi phương thức đóng, nhưng đó là phương sách cuối cùng nếu tôi không tìm được giải pháp khác.

Bất kỳ trợ giúp nào được đánh giá cao!

Trả lời

2

Điều bạn không gửi lại trang cho người dùng. Người dùng nhấp vào nút gửi yêu cầu HTTP, bạn tạo một phản hồi HTTP chứa tệp cần tải xuống. Nếu bạn muốn làm mới trang và chỉ sau đó gửi cho anh ta tệp để được dow nloaded, bạn cần gửi một kết quả bình thường postback (không gọi phương thức BeginDownload), và sau đó bằng cách nào đó buộc anh ta làm yêu cầu khác, khi bạn trả lời bằng tệp.

Có những lựa chọn khác nhau ở đây:

  • bao gồm meta refresh thẻ trên trang
  • sử dụng một onload JavaScript
  • sử dụng một iframe
  • ... hoặc có người sử dụng bấm vào một liên kết, như bạn nói .

Tất cả các phương pháp đều có nhược điểm của họ (đặc biệt là về bảo vệ "tải xuống không mong muốn" của IE, trong một số trường hợp có thể gây khó chịu), có lẽ bạn nên bao gồm liên kết tải xuống với “nếu tải xuống không bắt đầu tự động, bấm vào đây ”.)

+0

Tôi đã xây dựng một liên kết tải xuống vào GridView vì vậy nếu nó không tự khởi động hoặc họ hủy bỏ do nhầm lẫn, họ vẫn có thể tải xuống tệp vì nó được lưu trữ trên máy chủ. Cảm ơn những lời đề nghị, tôi chắc chắn sẽ nhìn vào chúng và xem cái nào hoạt động tốt nhất. – Delebrin

1

Có vẻ như bạn đang cố gắng làm quá nhiều cùng một lúc. Tôi khuyên bạn nên đăng lại để cập nhật GridView rồi sử dụng chuyển hướng đến trang mới, chuyên dụng (hoặc trình xử lý ashx) để tải xuống tệp. Trang xem lưới sẽ vẫn hiển thị khi bạn sử dụng tiêu đề bố trí nội dung trong trình xử lý trang tải xuống/trox.

+0

Tôi đồng ý Tôi có thể làm quá nhiều cùng một lúc. Cảm ơn bạn đã đề xuất, tôi sẽ xem tất cả những gì tôi có thể làm và sau đó chọn giải pháp ở đây cho bất kỳ điều gì hoạt động tốt nhất! – Delebrin

3

Đây là cách tôi đã làm một cái gì đó tương tự như đôi khi cách đây:

  1. On postback (tạo dữ liệu), gửi lại các trang được cập nhật với các dữ liệu mới nhất trong GridView.
  2. Thêm một hàm javascript nhỏ mà thực hiện khi trang hoàn bốc mà yêu cầu các tập tin được tạo ra (cái gì đó như window.location='fileurl';. Tất nhiên chỉ gửi hàm javascript này trên postback.

Nội dung của trang hiển thị không thay đổi khi yêu cầu một tệp, nó sẽ đơn giản bật lên hộp thoại lưu của trình duyệt của bạn

+0

Tôi đã xem xét một cách tiếp cận javascript với một bộ đếm thời gian trước đây, nhưng tôi đã không cố gắng chỉ gửi các chức năng trực tiếp chỉ khi nó là cần thiết. Tôi sẽ kiểm tra vào tùy chọn này. Cám ơn vì sự gợi ý! – Delebrin

Các vấn đề liên quan