2011-02-07 11 views
6

Uygulamamda, Kullanıcıya verilen bazı veritabanı bilgileri için karşıdan yüklemek için bir zip dosyası yapıyorum. Kullanıcı bir "veri oluştur" düğmesine tıkladığında zip dosyası oluşturulur ve veritabanında isteği günlüğe kaydederim.Bir Postback sonra bir dosya yüklemesini başlatın

Sayfamda, Kullanıcı'nın indirme geçmişini gösteren ve ayrıca en son oluşturulan dosyayı belirli bir süre için indirme olanağı sunan bir Gridview'im var.

Yapmakta olduğum sorun, düğmeyi tıkladıklarında sayfanın yenilenmesini (böylelikle ızgara görünümünü yenilemesini ve en son isteklerini göstermesini) isterim ve sonra onlar için dosya yüklemesini başlatırım (IE, yukarı Onları açıp/iptal edip iptal edip etmeyeceğine karar vermelerini isteyin).

Bir gönderiye karşı indirme işlemini başlatabilirim, ancak Gridview'im başlamadan önce güncellenmiyor, bu nedenle listedeki en yeni isteği göstermiyor. İndirme isteminin başlamasından ÖNCE, gridview'i nasıl güncelleyebilirim?

ben indirmeye başlamak için aşağıdaki kullanıyorum:

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(); 
    } 

gizli bir alan tıkladıklarında belirlediğim hangi (true olarak ayarlanırsa yöntem, son öğe olarak Page_Load olayına denir dosyayı oluşturmak için kullanılan düğme).

Ayrıca jQuery/AJAX çağrılarını kullanarak sayfayı yenilemeyi ve indirme işlemini küçük bir başarı ile başlatmayı denedim. Kalıcı bir iletişim kutusu açmayı ve indirme işlemini başlatmak için bir bağlantıyı tıklatmayı ve sonra da modal kapandığında sayfayı yenilemeyi düşünmüştüm, ancak başka bir çözüm bulamazsam bu son çare olur.

Herhangi bir yardım büyük beğeni topluyor!

cevap

2

Buradaki şey, sayfayı kullanıcıya geri göndermemenizdir.Kullanıcı, bir HTTP isteğini gönderen düğmeyi tıklar. İndirilecek dosyayı içeren bir HTTP yanıtı yaratırsınız. Eğer sayfayı yenilemek isterseniz ve sadece bundan sonra ona dosyayı dow olarak gönderirseniz Nloaded, normal bir geri gönderme sonucu göndermeniz gerekir (BeginDownload yöntemini çağırmak değil), ve sonra bir şekilde dosyayı yanıtladığınız başka bir isteği yapmak için zorlayın.

çeşitli seçenekler burada vardır: dediğin gibi

  • , bir bağlantıyı tıklayın ifra
  • kullandığınız bir onload JavaScript
  • kullanmak ... ya kullanıcı var sayfa
  • üzerinde meta refresh etiketini dahil .

tüm yöntemler kendi olumsuzlukları (özellikle bazı koşullarda, can sıkıcı olabilir, IE “istenmeyen indirme” koruma konusunda dikkatli olun), en azından indirme yapmazsa”ile indirme bağlantısı eklemek muhtemelen gerektiğini sahip otomatik olarak başlat, buraya tıkla ”.)

+0

Şebeke görünümüne bir indirme bağlantısı oluşturdum, böylece kendi başına başlamazsa veya yanlışlıkla iptal edildiyse, sunucuda depolandığından beri dosyayı indirebilirler. Önerileriniz için teşekkürler, kesinlikle onlara bakacağım ve hangisinin daha iyi çalıştığını göreceğim. – Delebrin

1

Aynı anda çok fazla yapmaya çalıştığınız anlaşılıyor. Izgarayı güncellemek için dosyayı geri göndermenizi ve ardından dosyayı indirmek için yeni, özel bir sayfaya (veya ashx işleyicisine) yönlendirmeyi kullanmanızı öneriyorum. İçerik sayfası üstbilgisini indirme sayfası/ashx işleyicisinde kullandığınızda, ızgara görünümü sayfası görünür kalmalıdır.

+0

Muhtemelen bir seferde çok fazla uğraştığımı kabul ediyorum. Önerileriniz için teşekkürler, neler yapabileceğimi göreceğim ve en iyi ne olursa olsun burada bir çözüm seçeceğim! – Delebrin

3

Burada benzer süre önce bir şey yaptı edebilirsiniz: postback üzerinde

  1. (veri üretebilmek), GRIDVIEW en yeni verilerle güncellenen sayfayı geri göndermek. sayfa tamamlanan yükleme ve hangi oluşturulan dosya (window.location='fileurl'; gibi bir şey istediğinde
  2. yürütür küçük javascript fonksiyonu ekleyin. Tabii sadece geri gönderme bu javascript fonksiyonu gönderin.

görüntülenen sayfanın içeriği değil Bir dosya isteğinde değişiklik yaptıktan sonra, tarayıcınızın kaydetme diyalog penceresini açacaktır.

+0

Daha önce bir zamanlayıcı ile javascript yaklaşımını inceledim, ancak sadece gerekli olduğunda fonksiyonu doğrudan göndermeyi denemedim. Bu seçeneği kontrol edeceğim. Önerin için teşekkürler! – Delebrin